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

Posted

技术标签:

【中文标题】使用长文件路径时的 Get-ChildItem 错误处理【英文标题】:Get-ChildItem error handling when using long file paths 【发布时间】: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。即使到达太长的文件夹,我也想打印。

【问题讨论】:

不要通过重复发帖再次问您的问题。 ***.com/questions/39572006/… 你可以处理异常:[System.IO.PathTooLongException] 【参考方案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"

【讨论】:

以上是关于使用长文件路径时的 Get-ChildItem 错误处理的主要内容,如果未能解决你的问题,请参考以下文章

如何Get-Childitem 只包含子文件夹和文件?

windows路径太长无法删除

如何使用 Get-ChildItem -exclude 排除多个文件夹?

如何在 PowerShell 的 Get-ChildItem -Exclude cmdlet 中对目录使用通配符

添加 Get-ChildItem 列表的文件大小

使用Move-Item时找不到路径