Comment puis-je quitter un fichier batch de l'intérieur d'un sous-programme?
Si j'utilise la commande EXIT, je reviens simplement à la ligne où j'ai appelé le sous-programme et l'exécution continue.
Voici un exemple:
@echo off
ECHO Quitting...
CALL :QUIT
ECHO Still here!
GOTO END
:QUIT
EXIT /B 1
:END
EXIT /B 0
Production:
Quitting...
Still here!
Mise à jour:
Ce n'est pas une bonne réponse, mais j'ai fini par faire quelque chose comme:
@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 déclaration à double tuyau de:
CALL :SUBROUTINE_WITH_ERROR || GOTO HANDLE_FAIL
est un raccourci pour:
CALL :SUBROUTINE_WITH_ERROR
IF ERRORLEVEL 1 GOTO HANDLE_FAIL
J'aimerais toujours savoir s'il existe un moyen de sortir directement d'un sous-programme plutôt que de devoir faire appel à l'appelant pour gérer la situation, mais cela fait au moins le travail.
Mise à jour # 2: Lorsque j'appelle un sous-programme à partir d'un autre sous-programme, appelé de la manière ci-dessus, j'appelle ainsi de l'intérieur des sous-programmes:
CALL :SUBROUTINE_WITH_ERROR || EXIT /B 1
De cette façon, l'erreur se propage de nouveau au "principal", pour ainsi dire. La partie principale du lot peut alors gérer l'erreur avec le gestionnaire d'erreurs GOTO: FAILURE
GOTO :EOF
%~0
à la variable au lieu detrue
:if not "%selfwrapped%"=="%~0" ( set selfwrapped=%~0 .... )
. De cette façon, vous pouvez utiliser la même astuce dans plusieurs scripts batch qui s'appellent les uns les autres.%~0
) avec tous les arguments (%*
) à partir d'un cmd.exe imbriqué, et le/s
est utilisé pour contrôler la façon dont l'%ComSpec%
argument gère les guillemets doubles autour du appel.Que diriez-vous de cet ajustement mineur?
Production:
Techniquement, cela ne sort pas du sous-programme. Au lieu de cela, il vérifie simplement le résultat du sous-programme et prend des mesures à partir de là.
la source
Si vous ne souhaitez pas revenir de la procédure, n'utilisez pas
call
: utilisez plutôtgoto
.la source
J'ai mis la gestion des erreurs dans mes fichiers batch. Vous pouvez appeler des gestionnaires d'erreurs comme ceci:
Et voici la fin du fichier batch:
la source
Cela quittera le contexte actuel et un contexte parent (c.-à-d. Lorsqu'il sera exécuté à l'intérieur d'un
call
script de sous-programme profond se fermera):Ou, si vous avez besoin du niveau d'erreur 0:
Fondamentalement,
(goto) 2>nul
définit errorlevel à 1 (sans générer d'erreur), renvoie l'exécution au contexte parent et au code après l'exécution du double canal dans le contexte parent.type nul>nul
définit errorlevel à 0.UPD:
Pour renvoyer l'exécution plus de deux fois de suite, enchaînez plusieurs
(goto) 2>nul ||
comme ceci:Voici un sous-programme récursif pour renvoyer le contexte un nombre variable de fois:
Lorsqu'il est appelé à partir d'une fonction récursive:
la sortie sera:
la source