使用长文件路径时Get-ChildItem错误处理

时间:2016-09-23 13:59:50

标签: powershell

我正在尝试在扫描文件夹时处理错误。让我们说我有类似的东西:

Get-ChildItem $somepath -Directory | ForEach-Object {
   if(error occurred due to too long path) {
        skip this folder then
   } else {
       Write-Host $_.BaseName
   }
}

当我这样做时,我在$somepath中打印文件夹,直到其中一个文件夹太长,然后循环停止。即使使用SilentlyContinue。我想在到达太长的文件夹后打印。

3 个答案:

答案 0 :(得分:3)

如果您可以安装非古老的PowerShell版本(3.0或更高版本),只需在路径前添加\\?\即可克服完整路径的260个字符限制:

Get-ChildItem "\\?\$somepath" | ForEach {
    # ............
}

答案 1 :(得分:0)

您可以尝试使用Where-Object cmdlet忽略长度超过260个字符的文件。

Get-ChildItem $somepath -Directory -ErrorAction SilentlyContinue `
    | Where-Object {$_.length -lt 261} `
    | ForEach-Object { Write-Host $_.BaseName }

或者您可以使用以下内容(Ref)。

cmd /c dir $somepath /s /b | Where-Object {$_.length -lt 261} 

答案 2 :(得分:0)

我将添加我的解决方案,因为此页面上的任何一个都不适合我。我使用的是相对路径,所以我不能使用 \\ 前缀。

$TestFiles = Get-ChildItem $pwd "*Tests.dll" -Recurse | Where-Object {$_.FullName.length -lt 261} | Select-Object FullName -ExpandProperty FullName | Where-Object FullName -like "*bin\Release*"
Write-Host "Found TestFiles:"
foreach ($TestFile in $TestFiles) {
    Write-Host "   $TestFile"
}