如何为针对服务器列表执行的Robocopy复制操作生成结果输出文件
如何为针对服务器列表执行的Robocopy复制操作生成结果输出文件
我来帮你搞定这个问题!要实现把每台服务器的Robocopy复制结果(成功/失败)记录到输出文件里,我们可以利用Robocopy的退出码特性来判断操作状态,再把服务器名和对应的结果写入日志文件。
先给你划个重点:Robocopy的退出码不是传统的「0成功非0失败」,它是位掩码形式的——退出码小于8的时候,说明复制操作整体是成功的(包括没有文件需要复制的情况);而退出码≥8时,才代表出现了错误(比如网络不通、权限不足、文件找不到等)。
下面是修改后的完整批处理脚本,我会一步步给你解释:
@echo off setlocal enabledelayedexpansion :: 定义输出日志文件的路径,你可以根据需求修改位置和文件名 set "LogFile=Robocopy_Results.log" :: 初始化日志文件,写入标题和时间戳(如果要追加记录而非覆盖,把第一行的>改成>>即可) echo Robocopy 复制操作结果记录 > "%LogFile%" echo 记录生成时间: %date% %time% >> "%LogFile%" echo ------------------------------- >> "%LogFile%" for /F "tokens=*" %%i in (Maquinas_log.txt) do ( echo 正在处理服务器:%%i :: 执行Robocopy,加上/NFL/NDL/NJH/NJS参数是为了减少冗余输出,保持控制台简洁 robocopy.exe "E:\HERRAMIENTAS\SCRIPTS\ActualizarFirmas" \\%%i\c$\temp firmas.exe /R:1 /W:1 /NFL /NDL /NJH /NJS :: 获取Robocopy的退出码,这里需要启用延迟扩展才能在循环内正确读取变量 set "ExitCode=!errorlevel!" :: 判断操作状态并写入日志 if !ExitCode! LSS 8 ( echo %%i - 复制成功 >> "%LogFile%" ) else ( echo %%i - 复制失败,退出码: !ExitCode! >> "%LogFile%" ) ) echo 所有服务器处理完成!结果已写入 "%LogFile%" exit /b
关键细节说明:
setlocal enabledelayedexpansion:因为我们在for循环里需要读取和修改变量(比如ExitCode),必须启用延迟扩展才能让变量在循环内实时更新,否则会拿到错误的退出码值。/NFL /NDL /NJH /NJS:这几个参数用来关闭Robocopy的冗余输出(比如文件列表、目录列表、作业头信息),如果需要保留Robocopy的详细执行日志,可以直接删掉这些参数,甚至把Robocopy的输出也追加到日志里——只需要把Robocopy的命令改成:robocopy.exe ... >> "%LogFile%" 2>&1(这样标准输出和错误信息都会写入日志)。- 日志初始化部分:如果希望每次运行脚本都保留之前的记录,把第一行的
>改成>>即可,这样新的记录会追加到日志末尾。
如果你还有其他定制需求(比如区分不同类型的失败原因),可以基于Robocopy的退出码做更细致的判断,比如退出码8代表磁盘错误,16代表严重错误等等。
备注:内容来源于stack exchange,提问作者juvenal
相关产品推荐
相关产品推荐

