¿Cómo puedo salir de un archivo por lotes desde una subrutina?
Si uso el comando EXIT, simplemente regreso a la línea donde llamé a la subrutina y la ejecución continúa.
Aquí hay un ejemplo:
@echo off
ECHO Quitting...
CALL :QUIT
ECHO Still here!
GOTO END
:QUIT
EXIT /B 1
:END
EXIT /B 0
Salida:
Quitting...
Still here!
Actualizar:
Esta no es una respuesta adecuada, pero terminé haciendo 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
La declaración de doble tubo de:
CALL :SUBROUTINE_WITH_ERROR || GOTO HANDLE_FAIL
es la abreviatura de:
CALL :SUBROUTINE_WITH_ERROR
IF ERRORLEVEL 1 GOTO HANDLE_FAIL
Todavía me gustaría saber si hay una manera de salir directamente de una subrutina en lugar de tener que hacer que el LLAMADOR se encargue de la situación, pero esto al menos hace el trabajo.
Actualización n. ° 2: cuando llamo a una subrutina desde otra subrutina, llamada de la manera anterior, llamo desde dentro de las subrutinas por lo tanto:
CALL :SUBROUTINE_WITH_ERROR || EXIT /B 1
De esta manera, el error se propaga de nuevo al "principal", por así decirlo. La parte principal del lote puede manejar el error con el controlador de errores GOTO: FAILURE
GOTO :EOF