避免 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
我们的编译系统使用 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