Windows 7下PowerShell路径过长报错,添加\?\无效求解决方案
解决Windows 7 PowerShell路径过长报错的方案
我明白你在Windows 7的PowerShell脚本里遇到了"The specified path, file name, or both are too long"的报错,尝试加了\\?\前缀还是没解决的困扰。这个问题在Windows 7里确实比较常见,因为PowerShell的原生cmdlet对长路径的支持有限,咱们试试下面这几个靠谱的方案:
方案一:用Robocopy替代Get-ChildItem(推荐,无需额外配置)
Robocopy是Windows自带的命令行工具,原生支持超长路径,完全能绕过这个限制。你可以用它来遍历文件并计算总大小,代码示例如下:
# 目标文件夹路径 $targetFolder = $i.FullName # 用Robocopy列出所有文件(仅列出不复制),捕获输出结果 $robocopyResult = robocopy $targetFolder NULL /L /S /NJH /NJS /BYTES /FP # 提取每个文件的字节大小并求和 $totalSize = ($robocopyResult | Where-Object { $_ -match '^\s*(\d+)\s+.*' } | ForEach-Object { [long]$matches[1] } | Measure-Object -Sum).Sum # 输出总大小(单位:字节) Write-Host "总大小:$totalSize 字节"
参数说明:
/L:仅列出文件,不执行复制操作/S:递归遍历子目录(不含空目录,要包含空目录用/E)/NJH/NJS:去掉Robocopy的头部信息和总结信息,只保留文件列表/BYTES:显示文件的字节大小/FP:显示完整文件路径
方案二:启用系统长路径支持+使用.NET方法遍历
这个方案需要先给Windows 7打补丁并修改注册表,然后用.NET的API来替代Get-ChildItem:
步骤1:安装必要补丁
确保你的Windows 7安装了KB2667602补丁(这个补丁是Windows 7支持长路径的基础,可通过微软官方渠道下载)。
步骤2:修改注册表启用长路径
- 按下
Win+R,输入regedit打开注册表编辑器 - 定位到路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem - 右键空白处,新建
DWORD(32位)值,命名为LongPathsEnabled,设置值为1 - 重启电脑生效
步骤3:用.NET方法编写脚本
注册表生效后,使用.NET的System.IO.Directory类来遍历文件,代码示例:
$totalSize = 0 $targetFolder = $i.FullName # 递归遍历所有文件,支持长路径 foreach ($filePath in [System.IO.Directory]::EnumerateFiles($targetFolder, "*", [System.IO.SearchOption]::AllDirectories)) { $fileInfo = [System.IO.FileInfo]::new($filePath) $totalSize += $fileInfo.Length } Write-Host "总大小:$totalSize 字节"
注意:这个方案需要你的Windows 7安装了**.NET Framework 4.6及以上版本**,否则.NET API可能不支持长路径。
为什么原来的\\?\前缀没用?
原因是PowerShell的Get-ChildItem cmdlet并没有完全兼容\\?\格式的路径解析,尤其是在递归遍历的时候,内部处理逻辑还是会受限于传统的路径长度限制,所以这个前缀在PowerShell里经常起不到预期效果。
内容的提问来源于stack exchange,提问作者Tak
相关产品推荐
相关产品推荐

