技术 · 实用指南
Robocopy 返回代码 1 但文件已复制?修正 CI 边界,不要误判复制失败
Robocopy 将 0–7 用作已完成结果,8 及以上才表示至少一次复制失败。先保存原始代码和日志,再在批处理、PowerShell 或 Jenkins 边界转换。

Robocopy 返回 1 表示所选文件已成功复制;但 Jenkins 等执行器会把任何非零状态当作失败。
应立即保存原始返回值:小于 8 视为完成结果,8 及以上失败,同时保留复制摘要和日志。
先捕获原始返回值
Robocopy 结束后立即读取 %ERRORLEVEL% 或 $LASTEXITCODE,其他外部命令可能覆盖它。
保存摘要中的 copied、FAILED、Mismatch 和 Extras;返回码负责分类,日志解释原因。
正确划分 0–7 与 8+
0 是无需复制,1 是复制成功,2–7 是其他无复制失败的完成组合。使用 /MIR 时仍要审查额外项和不匹配。
把 8 作为失败边界;不要使用“非零即失败”,也不要用可能误拒 5–7 的 0–3 简化规则。
在 cmd 和 PowerShell 中转换
批处理先保存 rc,再在 rc GEQ 8 时返回原失败码,否则向 CI 返回 0。复杂代码块要核对变量展开。
PowerShell 中先保存 $LASTEXITCODE 并写日志;小于 8 返回 0,否则返回原始值。
在 Jenkins 中保留失败
Jenkins 的 bat、powershell 与 pwsh 默认因非零失败;returnStatus: true 可返回状态供脚本比较。
小于 8 可让 CI 成功,但仍保留 Robocopy 日志;8 及以上应失败并记录原代码。
核验复制并记录
核对源和目标、复制与失败计数及代表性文件。/MIR 或 /PURGE 可能删除额外内容,非失败不等于策略安全。
记录命令、选项、原始代码、CI 代码和日志位置;路径或计数异常时停止调查。
