避免 robocopy 批量重置 errorlevel

Avoid robocopy to reset errorlevel in batch

我们的编译系统使用 robocopy 复制二进制依赖项。例如,假设的 copy_dependencies.bat 文件可以是这样的:

@echo off
robocopy %PARAMETERS% src_path\Debug   dst_path\Debug   dep_name.dll
robocopy %PARAMETERS% src_path\Release dst_path\Release dep_name.dll

由于此类二进制文件不会影响编译的成功,但会影响最终可执行文件的执行,因此我们希望为它们添加错误检查(例如,检查路径或文件名更改)。我们的想法是在测试 运行.

时尽快捕获它们,而不是在更深层次上捕获它们

如果批处理 returns 是非零错误级别,那么我们的编译系统会自动停止,我们的第一种方法是在每个批处理结束时检查错误级别:

@echo off
robocopy %PARAMETERS% src_path\Debug   dst_path\Debug   dep_name.dll
robocopy %PARAMETERS% src_path\Release dst_path\Release dep_name.dll

if errorlevel 8 exit /b
exit /b 0

注意: 我们检查错误级别是否至少为 8,因为较小的值只是对我们的警告(额外文件等)。这就是为什么我们还在最后将错误级别重置为 0

问题是 robocopy 重置了错误级别,因此如果第一个命令失败,则不会报告。然后,下一个解决方案是检查每个调用:

@echo off
robocopy %PARAMETERS% src_path\Debug   dst_path\Debug   dep_name.dll
if errorlevel 8 exit /b
robocopy %PARAMETERS% src_path\Release dst_path\Release dep_name.dll
if errorlevel 8 exit /b

exit /b 0

这里的问题是我们必须更改数百个文件。

除了 replace-all-like 脚本之外,还有更简洁的方法吗?类似于 robocopy 的标志,我们可以将其添加到 PARAMETERS 以避免重置?

另一种方法可能涉及批处理的执行标志,如果错误级别为 8 或更高,则自动退出脚本(因此我们可以在编译开始时设置它)。


PS

我发布了迄今为止最好的解决方案,但它仍然需要修改所有文件。更改批处理文件(特别是因为简单的模式)现在不是很耗时,但我想知道是否有不涉及此类更改的解决方案。谢谢!

更新

正如@DodgyCodeException 在评论中所建议的那样,解决此问题的最佳解决方案似乎是在每个 robocopy 语句前加上单行条件,以便只执行 robocopy如果之前没有提高错误级别。示例中显示的 copy_dependencies.bat 现在是:

@echo off
if not errorlevel 8 robocopy %PARAMETERS% src_path\Debug   dst_path\Debug   dep_name.dll
if not errorlevel 8 robocopy %PARAMETERS% src_path\Release dst_path\Release dep_name.dll

if errorlevel 8 exit /b
exit /b 0

之前的解决方案包括使用传播错误级别的中间批次(此处称为 my_robocopy.bat):

@echo off
if errorlevel 8 exit /b
robocopy %PARAMETERS% %*
exit /b

示例中显示的 copy_dependencies.bat 现在是:

@echo off
call %COMMON_PATH%\my_robocopy.bat src_path\Debug   dst_path\Debug   dep_name.dll
call %COMMON_PATH%\my_robocopy.bat src_path\Release dst_path\Release dep_name.dll

if errorlevel 8 exit /b
exit /b 0