Como posso sair de um arquivo em lotes de dentro de uma sub-rotina?
Se eu usar o comando EXIT, simplesmente retornarei à linha em que chamei a sub-rotina e a execução continuará.
Aqui está um exemplo:
@echo off
ECHO Quitting...
CALL :QUIT
ECHO Still here!
GOTO END
:QUIT
EXIT /B 1
:END
EXIT /B 0
Resultado:
Quitting...
Still here!
Atualizar:
Esta não é uma resposta adequada, mas acabei fazendo algo como:
@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
A declaração de canal duplo de:
CALL :SUBROUTINE_WITH_ERROR || GOTO HANDLE_FAIL
é uma abreviação de:
CALL :SUBROUTINE_WITH_ERROR
IF ERRORLEVEL 1 GOTO HANDLE_FAIL
Eu ainda adoraria saber se há uma maneira de sair diretamente de uma sub-rotina, em vez de ter que fazer o LIGADOR lidar com a situação, mas isso pelo menos faz o trabalho.
Atualização # 2: Ao chamar uma sub-rotina de dentro de outra sub-rotina, chamada da maneira acima, chamo de dentro das sub-rotinas da seguinte maneira:
CALL :SUBROUTINE_WITH_ERROR || EXIT /B 1
Dessa forma, o erro se propaga de volta para o "principal", por assim dizer. A parte principal do lote pode lidar com o erro com o manipulador de erros GOTO: FAILURE
GOTO :EOF