我在Windows 7的Powershell脚本中有以下一行
$subFolderItems = Get-ChildItem $i.FullName -recurse -force | Where-Object {$_.PSIsContainer -eq $false} | Measure-Object -property Length -sum | Select-Object Sum
在某些文件中出现此错误The specified path, file name, or both are too long
的问题。
我调查了一下,发现了一些建议,可以在我尝试的文件路径之前添加\\?\
,但它没有任何建议?
$Base = '\\?\'
$subFolderItems = Get-ChildItem $Base$i.FullName -recurse -force | Where-Object {$_.PSIsContainer -eq $false} | Measure-Object -property Length -sum | Select-Object Sum
答案 0 :(得分:1)
正如您所评论的,$i.FullName
中的路径采用UNC格式(\\server\share\restofpath
)。
在这种情况下,长路径的前缀应为\\?\UNC\
,并且路径本身的前两个反斜杠需要删除。您的情况应该是:
\\?\UNC\rackstation.mydom.com\main\sub.arch\mydom-customers\John_Marcus-123456
使用此前缀仅与-LiteralPath
的{{1}}参数一起使用。
尝试
Get-ChildItem
对于这样的事情,我总是方便地使用一个小的辅助函数:
Get-ChildItem -LiteralPath ('\\?\UNC\' + $i.FullName.Substring(2))
像这样使用它:
function Add-LongPathPrefix([string] $Path) {
if ([string]::IsNullOrWhiteSpace($Path) -or $Path.StartsWith('\\?\')) { #'# nothing to do here
return $Path
}
if ($Path.StartsWith('\\')) {
# it's a UNC path like \\server\share\restofpath
return '\\?\UNC\' + $Path.Substring(2) #'# --> \\?\UNC\server\share\restofpath
}
else {
# it's a local path like X:\restofpath
return '\\?\' + $Path #'# --> \\?\X:\restofpath
}
}
P.S。为此,您需要拥有Powershell 5.1或更高版本
希望有帮助