【问题标题】:Get-ChildItem error handling when using long file paths使用长文件路径时的 Get-ChildItem 错误处理
【发布时间】:2017-02-01 10:15:22
【问题描述】:

我正在尝试在浏览文件夹时处理错误。假设我有类似的东西:

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

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

【问题讨论】:

标签: powershell


【解决方案1】:

您可以尝试使用 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} 

【讨论】:

  • 即使在使用 SilentlyContinue 时我也写过 :( 然后它只是不打印错误,但超出该点不会打印。
  • 这对我不起作用。我喜欢长度的想法,但我们不想使用$_.FullName.length吗?
【解决方案2】:

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

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

【讨论】:

  • 我必须找到一个参考,但我的印象是这不再起作用了。
  • 可能在我的无知中,但我在运行时遇到错误:Illegal characters in path.Cannot retrieve the dynamic parameters for the cmdlet.....
  • PS5.1+Win7: puu.sh/rlaUh/748082bbdb.png 是的,它在 PS2 中不起作用,因为我刚刚尝试运行 powershell -version 2
  • 那部分是有道理的。我在 10 运行 v5。谢谢你的照片。
  • 如果有人对这方面的文档感兴趣:msdn.microsoft.com/en-us/library/aa365247.aspx
【解决方案3】:

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

$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"
}

【讨论】:

    猜你喜欢
    • 2013-11-15
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多