我有一个 powershell 脚本,可将 Web 应用程序的已发布文件复制到服务器以进行部署。它利用 robocopy 来复制文件。由于缺乏管理员权限,我只能使用可重新启动模式(/z),而不能使用可重新启动模式和备份模式(/zb)。我的问题分为两部分:
使用可重启模式的 robocopy 有多可靠 - 文件损坏的可能性有多大?
将检查合并到脚本中以查看文件在复制过程中是否已损坏的最佳方法是什么?
这是我的代码示例:
robocopy /s /z /ndl /r:0 /w:0 /mt:32 .\Publish "DESTINATION_HERE" /MIR
您不得仅依赖可重新启动模式来创建未损坏的文件。可重新启动模式让 robocopy 恢复(上次尝试的)文件的中断复制过程,以节省一些时间(因此只有在复制大文件时才有真正的好处)。但这种模式不能保证你“运行完成”,也不能保证目标文件位正确。
另外,不要将可重新启动模式与“重试直至成功”混淆。如果您想重试,则需要使用
/R
选项进行设置(在示例中已将其设置为 0),在这种情况下,建议设置 /W
(等待时间)。
像这样思考 robocopy 作业:Robocopy 在目标上创建一个时间戳为 1980-01-01 的虚拟文件。仅当文件被完全复制时(这意味着一次没有中断或“可检测到”错误)robocopy 才会根据设置的参数将此时间戳调整为当前时间戳或源文件的时间戳。但是,robocopy 确实会对目标文件执行写入时验证。此类功能需要由底层文件系统或操作系统功能提供(请参阅 verify
命令,但这也不能保证无错误复制)。
grep
(请参阅 Windows 的 coreutils)或 Windows 内置
findstr
和 find
)。或者,您可以抓取 robocopy 输出中的“失败”项目,或检查 robocopy 退出代码。我推荐后者,但您需要知道简单地检查 %errorlevel% == 0
(或 PowerShell 中的类似内容)是行不通的。 Robocopy 的退出代码代表一个位掩码来指示多个错误情况。有关详细信息,请参阅 robocopy 手册或在线帮助,例如 例如,
SS64.com 上的 robocopy 退出代码。 一般经验法则是退出代码 >= 8 意味着发生错误并且无法正确复制文件。 另一个简单的解决方案是连续运行两次 robocopy。如果第二个(也)完成而没有错误(即,日志也很短),您可以放心,所有文件都已复制完成,并且位错误的余量很小。
但是,复制的文件仍然可能被损坏,因为可能存在传输错误,或者目标硬盘写入正常但再次读取时出现故障。在这种情况下,您需要对文件进行哈希码验证,但 Robocopy 不提供此类功能。