Como posso sair de um arquivo de lote de dentro de uma sub-rotina?
Se eu usar o comando EXIT, simplesmente retornarei à linha onde chamei a sub-rotina e a execução continuará.
Veja um exemplo:
@echo off
ECHO Quitting...
CALL :QUIT
ECHO Still here!
GOTO END
:QUIT
EXIT /B 1
:END
EXIT /B 0
Saída:
Quitting...
Still here!
Atualização:
Esta não é uma resposta adequada, mas acabei fazendo algo nos moldes de:
@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 pipe duplo de:
CALL :SUBROUTINE_WITH_ERROR || GOTO HANDLE_FAIL
é uma abreviação para:
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 do que ter que fazer o CHAMADOR lidar com a situação, mas isso pelo menos faz o trabalho.
Atualização 2:
Ao chamar uma sub-rotina de outra sub-rotina, chamada da maneira acima, eu chamo de dentro das sub-rotinas assim:
CALL :SUBROUTINE_WITH_ERROR || EXIT /B 1
Dessa forma, o erro se propaga de volta para o "main", por assim dizer. A parte principal do lote pode, então, manipular o erro com o manipulador de erros GOTO: FAILURE