PowerShell中Get-ChildItem使用\?\UNC长路径前缀结果异常问题
PowerShell中
\\?\UNC路径与常规UNC路径使用Get-ChildItem的差异原因及解决方案 问题现象
- 命令1:
Get-ChildItem -Path "\\?\UNC\very\long\path",当目标路径长度小于260字符时,返回0个子项 - 命令2:
Get-ChildItem -Path "\\very\long\path",返回预期的所有子项 - 仅在命令1的路径末尾添加
\*(即Get-ChildItem -Path "\\?\UNC\very\long\path\*")时,结果才与命令2一致
差异原因
这是因为\\?\UNC是Windows原生的长路径语法,它跳过了PowerShell和.NET的路径解析逻辑,直接把路径传给Win32 API处理:
- 常规UNC路径(
\\very\long\path)下,Get-ChildItem默认会自动解析为“获取该目录下的所有子项”,相当于隐含了查询目录内容的逻辑 - 但用
\\?\UNC前缀的路径时,Win32 API会把这个路径当成精确指向的目录本身,而不是要查询它的内容。这时候Get-ChildItem只会确认目录存在,不会主动枚举子项,所以返回0个结果 - 加上
\*之后,路径明确表示“查询该目录下的所有内容”,Win32 API就会正确枚举目录里的子项,结果自然和常规路径一致
解决方案建议
既然你必须用\\?\UNC前缀处理可变长度的路径,建议统一在路径末尾加\*通配符:
- 对
\\?\UNC格式的路径:加\*能保证Get-ChildItem不管路径长度是否超260字符,都能正确枚举子项 - 对常规UNC路径:加
\*也不会影响结果(常规路径本身就有这个隐含逻辑),统一添加可以让两种格式的命令行为保持一致,避免因路径格式不同出问题
内容的提问来源于stack exchange,提问作者toscanelli
相关产品推荐
相关产品推荐

