使用长文件路径时的 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 -exclude 排除多个文件夹?