← 返回首页

Robocopy 安全复制:先预演,再读懂退出码

把旧电脑的资料补充到移动硬盘时,最危险的误会是把“复制”当成“同步”。目标目录可能已有手工整理的文件,源目录里没有它们,不代表它们应该消失。下面采用保守的新增式流程:保留目标独有文件,跳过目标已有文件,先查看计划再执行。示例依据官方文档编写,未在你的设备上运行。

先决定遇到同名文件怎么办

假设源目录为 C:\TransferSource,目标为 E:\TransferInbox。这里的盘符只是示例,必须换成实际路径。建议先把目标设为一个独立的新目录,不要直接指向硬盘根目录,也不要把目标放进源目录内部。

如果两边都有“报价.xlsx”,本流程不会判断哪个版本更有价值,而是保留目标版本。需要更新内容时,应单独比较后另存,不能一边要求“不覆盖”,一边期待旧文件自动更新。执行前关闭正在编辑源文件的应用,避免复制期间内容变化。

第一步:只生成复制计划

在 PowerShell 中运行:

New-Item -ItemType Directory -Force C:\CopyLogs | Out-Null
robocopy "C:\TransferSource" "E:\TransferInbox" /E /COPY:DAT /XC /XN /XO /XJ /R:2 /W:2 /L /TEE /LOG:C:\CopyLogs\preview.txt

/L 只列出计划,不实际复制;日志文件仍会写入。/E 包括空子目录;/XC /XN /XO 组合用于跳过目标已有文件;/XJ 排除目录连接点。/R:2 /W:2 限制失败重试次数与等待秒数,避免遇到问题后长时间看似卡住。这里仅复制数据、属性与时间戳,不承诺迁移原有访问权限。参数依据:Microsoft Robocopy 文档。

不要立即删掉 /L。先打开预演日志,核对源与目标的完整路径,再查看准备新增的文件是否属于本次资料。目标中的额外文件可以存在,不必为了让日志“好看”而删除。若计划为空,先检查是否全被跳过,而不是马上增加强制复制选项。

第二步:执行并立即保存退出码

确认计划后,仅移除 /L,并为正式运行使用另一份日志:

robocopy "C:\TransferSource" "E:\TransferInbox" /E /COPY:DAT /XC /XN /XO /XJ /R:2 /W:2 /TEE /LOG:C:\CopyLogs\copy.txt
$code = $LASTEXITCODE
if ($code -ge 8) {
    Write-Warning "存在复制失败,请查看日志。退出码:$code"
} else {
    Write-Host "未报告复制失败,仍需核对日志。退出码:$code"
}

退出码不是“非零就失败”:0 表示没有复制且未报告失败,1 表示成功复制,2 可表示目标存在额外文件;其他低于 8 的状态也可能包含差异信息。达到或超过 8 才表示至少一次复制失败。因此,自动化不能只检查是否等于零,也不能把低于八理解成内容已经完全验收。退出码说明。

最后验收,而不是追求漂亮数字

查看正式日志中的失败项,再从目标打开几份重要文档及不同子目录中的文件。重复预演可以发现仍计划新增的内容,但不能证明同名文件内容一致。遇到权限拒绝、空间不足或文件占用,应先解决具体原因,再以相同范围重跑。

还可以先建立一个只含几份可替代文件的练习目录:在目标放一份同名但内容不同的文件,再放一份目标独有文件。运行预演与正式命令后,检查两者是否保留。这种小规模演练用于理解你的操作范围,不能替代正式资料的逐项验收。

本流程不要加入 /MIR、/PURGE、/MOV 或 /MOVE:它们可能删除目标内容或移动源数据。也别照抄别人包含大量开关的命令。安全复制最重要的不是参数多,而是明确哪些内容允许改变,并留下可检查的记录。

写于此,留待再读。