Вы можете называть свои подпрограммы так:
call :b||exit /b 1
, что эквивалентно
call :b
if errorlevel 1 exit /b 1
Это немного короче и экономит одну строчку, но все равно не идеально, я согласен.
Кроме этого я не вижу пути.
РЕДАКТИРОВАТЬ: Хорошо, у меня есть способ, но это Pure Evil ™.
Неправильно используя максимальный размер стека и, следовательно, предел рекурсии, мы создаем другую подпрограмму, которая просто исчерпывает стек, рекурсивно вызывая себя:
@echo off
echo Calling a
call :a
echo Called a
goto :eof
:a
echo Calling b
call :b
echo Called b
goto :eof
:b
echo Trying to exit
call :exit
goto :eof
:exit
call :exit
Это, однако, приведет к появлению неприятного сообщения об ошибке
****** B A T C H R E C U R S I O N exceeds STACK limits ******
Recursion Count=704, Stack Usage=90 percent
****** B A T C H PROCESSING IS A B O R T E D ******
Кроме того, на моей машине это займет около 2 секунд.
Вы можете подавить сообщение об ошибке, изменив оператор call
следующим образом:
call :exit >nul 2>&1
, который перенаправит все, что хочет, в большую пустоту.
Но, учитывая время, необходимое для заполнения стека, я думаю, что первый вариант будет проще.
Я также обдумывал использование второго пакетного файла, который при запуске без call
по существу остановил бы первый. Но почему-то это плохо сочетается с подпрограммами. Развертывание стека вызовов, похоже, все еще происходит.