Время от времени время от времени , выход IMHO и выход / b прерываются, поскольку они устанавливают только уровень ошибки, используемый пакетными файлами, но не устанавливают код выхода процесса cmd.exe..
Если пакетный скрипт выполняет проверку уровня ошибок, достаточно вызова:
REM DoSomeAction.cmd
@echo off
call someprogram.exe
if errorlevel 1 exit /b
REM MainScript.cmd
@echo off
...
call DoSomeAction.cmd
if errorlevel 1 (
...
)
Но если вы хотите использовать && или ||синтаксис (myscript.cmd&&someotherapp.exe
) или ваш скрипт запускается из программы, а не из другого пакетного файла, вы на самом деле хотите установить код завершения процесса (получено с помощью GetExitCodeProcess в родительском процессе)
@echo off
call thiswillfail.exe 2>nul
if errorlevel 1 goto diewitherror
...
REM This code HAS to be at the end of the batch file
REM The next command just makes sure errorlevel is 0
verify>nul
:diewitherror
@%COMSPEC% /C exit %errorlevel% >nul
Использование «обычного» * 1014 * с последующим вызовом его с помощью call myscript.cmd&&someotherapp.exe
работает, но вы не можете предполагать, что каждая программа, выполняющая пакетный файл, создаст процесс как cmd.exe /c call yourscript.cmd