¿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
%~0
a la variable en lugar detrue
:if not "%selfwrapped%"=="%~0" ( set selfwrapped=%~0 .... )
. De esa manera, puede usar el mismo truco en múltiples secuencias de comandos por lotes que se llaman entre sí.%~0
) con todos los argumentos (%*
) de un cmd.exe anidado, y/s
se usa para controlar la forma en que el%ComSpec%
argumento maneja las comillas dobles alrededor del llamada.¿Qué tal este pequeño ajuste?
Salida:
Técnicamente esto no sale de la subrutina. Por el contrario, simplemente verifica el resultado de la subrutina y toma medidas desde allí.
fuente
Si no desea regresar del procedimiento, no use
call
: en su lugar, usegoto
.fuente
Puse el manejo de errores en mis archivos por lotes. Puede llamar a los controladores de errores de esta manera:
Y aquí está el final del archivo por lotes:
fuente
Esto saldrá del contexto actual y de un contexto principal (es decir, cuando se ejecute dentro de una
call
secuencia de comandos de subrutina profunda se cerrará):O, si necesita errorlevel 0:
Básicamente,
(goto) 2>nul
establece el nivel de error en 1 (sin generar un error), devuelve la ejecución al contexto primario y al código después de que se ejecuta la doble canalización en el contexto primario.type nul>nul
establece errorlevel en 0.UPD:
Para devolver la ejecución más de dos veces seguidas, encadene varias de
(goto) 2>nul ||
esta manera:Aquí hay una subrutina recursiva para devolver el contexto un número variable de veces:
Cuando se llama desde una función recursiva:
la salida será:
fuente