指定的路径,文件名或两者都太长Powershell

时间:2019-09-19 12:54:31

标签: powershell

我在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

1 个答案:

答案 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或更高版本

希望有帮助