Robocopy备份脚本待复制文件计数异常求助:实现准确进度统计
准确统计Robocopy待复制文件数的两种方案
方案一:让Get-ChildItem匹配Robocopy的扫描范围
你的计数偏差核心原因是Get-ChildItem默认不包含隐藏、系统文件,而Robocopy默认会处理这类文件(除非你用/XA:H//XA:S参数主动排除)。要修正这个问题,需要调整Get-ChildItem的参数,并同步Robocopy的排除规则:
- 用
-Force参数让Get-ChildItem扫描所有文件(包括隐藏、系统) - 同步排除你Robocopy脚本中指定忽略的文件(比如desktop.ini)
示例代码:
# 获取源端所有文件(含隐藏、系统),排除指定文件 $sourceFiles = Get-ChildItem D:\ -Recurse -Force -File | Where-Object { $_.Name -ne 'desktop.ini' } # 获取备份端所有匹配文件 $backupFiles = Get-ChildItem B:\ -Recurse -Force -File | Where-Object { $_.Name -ne 'desktop.ini' } # 计算待复制文件数:源端存在但备份端缺失的文件 $backupPaths = $backupFiles.FullName $pendingCount = ($sourceFiles | Where-Object { $backupPaths -notcontains $_.FullName.Replace('D:\', 'B:\') }).Count
注意:如果你的Robocopy脚本还排除了其他文件/属性(比如只读文件、特定扩展名),需要在Where-Object中同步添加对应过滤条件。
方案二:直接用Robocopy的预览模式统计(最准确)
直接利用Robocopy本身的/L参数(仅预览复制动作,不实际复制),解析它的输出统计,这是最准确的方式——完全和你实际执行的Robocopy复制范围一致:
示例代码:
# 替换成你实际的Robocopy命令,仅添加/L(预览)、/NP(无进度)、/NFL(不显示文件列表)、/NDL(不显示目录列表)参数 $robocopyOutput = robocopy D:\ B:\ /E /COPYALL /L /NP /NFL /NDL # 解析输出中的统计行,提取待复制文件数 $totalFiles = [int](($robocopyOutput | Where-Object { $_ -match 'Total Files\s+:\s+(\d+)' }) -replace 'Total Files\s+:\s+(\d+)', '$1') $copiedFiles = [int](($robocopyOutput | Where-Object { $_ -match 'Copied\s+:\s+(\d+)' }) -replace 'Copied\s+:\s+(\d+)', '$1') $pendingCount = $totalFiles - $copiedFiles
参数说明:
/L:让Robocopy只模拟复制流程,不实际写入文件/NP:禁止显示进度百分比,避免干扰统计行解析/NFL/NDL:不输出具体文件/目录列表,只保留最终统计行
负数计数的原因
当Robocopy复制了Get-ChildItem未统计的隐藏/系统文件到备份端后,你用未包含这些文件的源端统计数去对比备份端的实际文件数(包含了这些文件),就会出现源端统计数 < 备份端统计数,最终计算出负数的待复制数。
内容的提问来源于stack exchange,提问作者Tyrone Hirt
相关产品推荐
相关产品推荐

