Как я могу выйти из командного файла из подпрограммы?
Если я использую команду EXIT, я просто возвращаюсь к строке, где я вызвал подпрограмму, и выполнение продолжается.
Вот пример:
@echo off
ECHO Quitting...
CALL :QUIT
ECHO Still here!
GOTO END
:QUIT
EXIT /B 1
:END
EXIT /B 0
Выход:
Quitting...
Still here!
Обновить:
Это неправильный ответ, но в итоге я сделал что-то вроде:
@echo off
CALL :SUBROUTINE_WITH_ERROR || GOTO HANDLE_FAIL
ECHO You shouldn't see this!
GOTO END
:SUBROUTINE_WITH_ERROR
ECHO Simulating failure...
EXIT /B 1
:HANDLE_FAIL
ECHO FAILURE!
EXIT /B 1
:END
ECHO NORMAL EXIT!
EXIT /B 0
Двухтрубный оператор:
CALL :SUBROUTINE_WITH_ERROR || GOTO HANDLE_FAIL
является сокращением для:
CALL :SUBROUTINE_WITH_ERROR
IF ERRORLEVEL 1 GOTO HANDLE_FAIL
Я все еще хотел бы знать, есть ли способ выйти непосредственно из подпрограммы, а не заставлять CALLER справиться с ситуацией, но это, по крайней мере, делает работу.
Обновление № 2: При вызове подпрограммы из другой подпрограммы, вызываемой вышеописанным способом, я вызываю подпрограмму таким образом:
CALL :SUBROUTINE_WITH_ERROR || EXIT /B 1
Таким образом, ошибка распространяется обратно до «основного», так сказать. Затем основная часть пакета может обработать ошибку с помощью обработчика ошибок GOTO: FAILURE
GOTO :EOF
%~0
переменной вместоtrue
:if not "%selfwrapped%"=="%~0" ( set selfwrapped=%~0 .... )
. Таким образом, вы можете использовать один и тот же прием в нескольких пакетных сценариях, которые вызывают друг друга.%~0
) со всеми аргументами (%*
) из вложенного cmd.exe, и/s
он используется для управления способом, которым%ComSpec%
аргумент обрабатывает двойные кавычки вокруг вызов.Как насчет этой незначительной корректировки?
Выход:
Технически это не выходит из подпрограммы. Скорее, он просто проверяет результат подпрограммы и предпринимает действия оттуда.
источник
Если вы не хотите возвращаться из процедуры, не используйте
call
: вместо этого используйтеgoto
.источник
Я поместил обработку ошибок в мои командные файлы. Вы можете вызвать обработчики ошибок следующим образом:
И вот конец командного файла:
источник
Это выйдет из текущего контекста и родительского контекста (т.е. при выполнении внутри одного
call
скрипта глубокой подпрограммы выйдет):Или, если вам нужен уровень ошибки 0:
По сути,
(goto) 2>nul
устанавливает уровень ошибки равным 1 (без вывода ошибки), возвращает выполнение в родительский контекст и код после выполнения двойной трубы в родительском контексте.type nul>nul
устанавливает уровень ошибки равным 0.UPD:
Чтобы возвратить выполнение более двух раз подряд, соедините несколько цепочек
(goto) 2>nul ||
следующим образом:Вот рекурсивная подпрограмма, которая возвращает контекст переменное число раз:
Когда вызывается из рекурсивной функции:
вывод будет:
источник