执行Top32大文件查询命令遇路径过长错误,已开长路径支持仍无效
解决DFS暂存区计算脚本的长路径错误问题
问题根源
尽管你已通过注册表启用Windows长路径支持,但PowerShell 5.1及以下版本的Get-ChildItem(别名gci)默认不兼容长路径,即使系统层面开启支持,该cmdlet仍受限于传统260字符路径限制。
解决方案
以下是按优先级排序的可行解决办法:
1. 升级到PowerShell 7+
PowerShell 7及以上版本原生支持长路径,无需额外配置,直接运行原脚本即可规避路径过长错误。
2. 改用.NET API枚举文件(适用于PowerShell 5.1)
通过调用.NET的Directory.EnumerateFiles方法绕过Get-ChildItem的限制,修改后的脚本如下:
measure-command { $total = New-Object System.Collections.ArrayList # 用.NET方法枚举所有文件,支持长路径 [System.IO.Directory]::EnumerateFiles("F:\Folder\with\966693\items", "*", [System.IO.SearchOption]::AllDirectories) | ForEach-Object { $fileInfo = New-Object System.IO.FileInfo($_) $total.Add($fileInfo.Length) > $null } # 计算Top32文件总大小(单位:GB) ($total | Sort-Object -Descending | Select-Object -First 32 | Measure-Object -Sum).Sum / 1GB }
注意:此方法需确保
LongPathsEnabled设置已生效(设置后需重启系统)。
3. 临时启用PowerShell长路径兼容
在PowerShell 5.1中,执行以下命令后再运行原脚本,部分场景可解决问题:
$env:__COMPAT_LAYER = "LongPathAware"
4. 映射驱动器缩短路径
将长路径文件夹映射为虚拟驱动器,降低路径长度:
New-PSDrive -Name Z -PSProvider FileSystem -Root "F:\Folder\with\966693\items"
随后将脚本中的路径替换为Z:\即可。
额外注意事项
- 启用
LongPathsEnabled后必须重启系统才能生效,若刚完成设置请先重启。 - 确保脚本运行账号拥有目标文件夹所有子目录的访问权限。
内容的提问来源于stack exchange,提问作者Jonathan Rodriguez
相关产品推荐
相关产品推荐

