Windows 命令:根据第一个命令设置链接命令的退出代码

Windows command: Set exit code of chained commands based on first command

我有这种情况(这是在 Azure Batch 任务上执行的命令):

cmd /c MainApp.exe & Util.exe

我需要的是使用 MainApp.exe 的退出代码退出整个命令,因为 Util.exe 总是以 0 代码退出。

我尝试过使用不同的括号位置进行类似的操作,但没有任何效果。

cmd /c (MainApp.exe) & set taskExitCode=%ERRORLEVEL% & Util.exe & exit %taskExitCode%

感谢您的帮助

有两个问题:

  1. Util.exe 实际上不会在您启动的 cmd 实例的上下文中调用,但我想您想要那个;要解决此问题,请转义与号或引用命令行:

    cmd /C MainApp.exe ^& Util.exe
    

    或:

    cmd /C "MainApp.exe & Util.exe"
    
  2. 由于您试图在同一命令 中读取变量 line/block,因此您需要启用并应用 delayed expansion,可以通过cmd /V实现,像这样:

    cmd /V /C MainApp.exe ^& set /A ERR=!ErrorLevel! ^& Util.exe ^& exit !ERR!
    

    或:

    cmd /V /C "MainApp.exe & set /A ERR=!ErrorLevel! & Util.exe & exit !ERR!"
    

    这仅在 MainApp.exe 还设置了 ErrorLevel 的情况下有效,它并不总是与退出代码相同。如果没有,您可以试试这个(|| 运算符强制 ErrorLevel 等于当前退出代码):

    cmd /V /C MainApp.exe ^|^| rem/ ^& set /A ERR=!ErrorLevel! ^& Util.exe ^& exit !ERR!
    

    或:

    cmd /V /C "MainApp.exe || rem/ & set /A ERR=!ErrorLevel! & Util.exe & exit !ERR!"
    

万一Util.exe不需要执行万一MainApp.exe returns一个非零退出代码,这样做(所以MainApp.exe的退出代码存活):

cmd /C MainApp.exe ^&^& Util.exe

或:

cmd /C "MainApp.exe && Util.exe"

如果MainApp.exe确实没有设置ErrorLevel,您可以尝试以下方法:

cmd /C MainApp.exe ^&^& Util.exe || rem/

或:

cmd /C "MainApp.exe && Util.exe || rem/"