PowerShell脚本统计重复文件大小报错排查求助
问题排查与修正方案
报错原因分析
- 第20行的
($DuplicateFile.Path).Length是获取路径字符串的长度(比如示例里的140),而非文件的实际大小。你把这个数值传给Get-ChildItem,它自然会把140当成路径去查找,导致"找不到路径"的错误。 $size变量未初始化,默认是$null,累加后结果异常,最后输出0MB。
修正后的脚本
# 指定要扫描的目录 $FolderPath = "C:\Users\Ben\Music\Apple Music\Media\Music\" # 初始化总删除大小为0字节 $totalDeletedSize = 0 # 获取目录下所有文件(递归) $Files = Get-ChildItem -Path $FolderPath -Recurse -File # 按文件哈希分组,筛选出重复组(数量>1) $Files | Get-FileHash | Group-Object -Property Hash | Where-Object { $_.Count -gt 1 } | ForEach-Object { # 遍历每组重复文件 foreach ($DuplicateFile in $_.Group) { # 跳过每组的第一个文件(保留一份) if ($DuplicateFile -ne $_.Group[0]) { Write-Host "待删除: $($DuplicateFile.Path)" # 获取当前重复文件的实际大小(字节) $fileSize = (Get-Item -Path $DuplicateFile.Path).Length # 累加到总大小 $totalDeletedSize += $fileSize # 解除注释即可执行删除操作 # Remove-Item -Path $DuplicateFile.Path -Force } } } # 根据总大小自动转换单位并输出 if ($totalDeletedSize -ge 1GB) { $formattedSize = "{0:N2}GB" -f ($totalDeletedSize / 1GB) } elseif ($totalDeletedSize -ge 1MB) { $formattedSize = "{0:N2}MB" -f ($totalDeletedSize / 1MB) } else { $formattedSize = "{0:N2}KB" -f ($totalDeletedSize / 1KB) } Write-Host "待删除重复文件总大小: $formattedSize"
关键修改说明
- 修复文件大小获取逻辑:用
(Get-Item $DuplicateFile.Path).Length直接获取文件的实际字节大小,不再错误读取路径字符串长度。 - 初始化总大小变量:提前将
$totalDeletedSize设为0,避免累加时出现$null导致的计算异常。 - 新增智能单位转换:根据总大小自动选择GB/MB/KB单位,保留两位小数,输出更直观。
- 优化变量命名:将模糊的
$size改为$totalDeletedSize,提升代码可读性。
内容的提问来源于stack exchange,提问作者Benjamin Rich
相关产品推荐
相关产品推荐

