J'essaie de comprendre où le code renvoie exactement GOTO :EOF
?
Voici le code:
SET count=1
FOR /f "tokens=*" %%G IN (somefile.txt) DO (call :subroutine "%%G")
GOTO :EOF
:subroutine
echo %count%:%1
set /a count+=1
GOTO :EOF
:EOF
est une étiquette prédéfinie, comme l'explique Microsoft dans la documentation de la commande GOTO . L'aide fournie en exécutant une commande Invite window goto /?
explique également cette étiquette spéciale pour End Of File. Mais cette étiquette prédéfinie est prise en charge uniquement lorsque les extensions de commande sont activées par défaut.
L'aide est affichée en exécutant une commande dans la fenêtre Prompt call /?
et, bien entendu, la documentation de la commande CALL explique à la fois que goto :EOF
doit être utilisé pour quitter un sous-programme appelé avec call :Label
.
Un sous-programme n'est rien d'autre qu'un autre fichier de commandes incorporé dans le fichier de commandes en cours appelé avec la commande call
. Si le sous-programme se trouve à la fin du fichier de commandes, la fin réelle du fichier marque la fin du sous-programme.
Mais il peut y avoir plusieurs sous-routines dans un fichier batch.
Une commande est donc nécessaire pour que l'interpréteur de commande puisse quitter le sous-programme lorsqu'il atteint une ligne spécifique du traitement de la commande et revenir à la ligne de commande appelante. goto :EOF
ainsi que exit /B
peuvent être utilisés partout pour quitter un sous-programme ou pour quitter le traitement du fichier de commandes en cours.
Dans le code de lot en question, le traitement firstgoto :EOF
est nécessaire pour le traitement de sortie du fichier de traitement par lots sans que le code de la sous-routine subisse une chute indésirable après avoir terminé la boucle.
Le code secondgoto :EOF
dans le code de lot de l'interrogateur sert à quitter le sous-programme et poursuivre le traitement dans POUR LA BOUCLE de la deuxième ligne. Il ne ferme pas le traitement du fichier de commandes, il ne ferme que le traitement du sous-programme.
Remarque 1:goto EOF
sans deux points nécessite qu’il existe réellement une ligne commençant par :EOF
dans le fichier de commandes, c’est-à-dire que l’étiquette de saut EOF
doit exister dans le fichier. goto :EOF
entraîne toujours la fermeture du traitement par sous-routine/traitement par lots avec les extensions de commande activées même s'il existe une étiquette EOF
dans le fichier de traitement par suite d'une ligne commençant par :EOF
.
Remarque 2: La commandeEXIT sans le paramètre /B
entraîne toujours la sortie du processus de commande complet indépendamment de la hiérarchie des appels et du mode de démarrage du processeur de commandes Windows - avec le paramètre /K
à keepcmd.exe
s’exécutant tel qu’il est utilisé lors de l’ouverture d’une fenêtre d’invite de commande ou avec /C
à close après le traitement de la commande, tel qu’il est utilisé lors d’un double-clic sur un fichier de commandes. Par conséquent, exit
sans /B
doit être utilisé judicieusement dans un fichier de traitement par lots (meilleur: jamais).
Note 3:exit /B
ne fonctionne pas avec les extensions de commande désactivées, comme illustré par ce code:
@echo off
setlocal DisableExtensions
echo Use command exit /B with command extensions disabled.
exit /B
L'exécution de ce fichier de commandes à partir d'une fenêtre d'invite de commande génère le message d'erreur suivant:
Le système ne trouve pas l'étiquette de lot spécifiée - EOF
En d'autres termes, exit /B
sans code de sortie supplémentaire est identique à goto :EOF
et dépend donc également des extensions de commande. exit
sans /B
sans ou avec un code de sortie fonctionne toujours.
Remarque 4:ERRORLEVEL
n'est pas concerné par goto :EOF
, mais la documentation Microsoft GOTO est muette sur ce sujet. exit /B #
définit ERRORLEVEL
sur #
comme indiqué par Microsoft. exit /B #
peut également être utilisé à la place de goto :EOF
pour quitter un sous-programme avec un code de sortie spécifique évalué sur la ligne de commande appelant le sous-programme, comme sur les opérateurs &&
ou ||
ou sur la commande suivante après l'appel de la ligne de commande avec if errorlevel X
. Cependant, il n'est généralement pas nécessaire de quitter explicitement un fichier de commandes ou un sous-programme avec un code de sortie spécifique, car ni goto :EOF
ni exit /B
ne modifie la valeur actuelle de ERRORLEVEL
.
Pour plus de détails sur le comportement ERRORLEVEL
, voir:
GOTO :EOF
est fonctionnellement équivalent à exit /B
, mais les deux formes ne fonctionnent que lorsque les extensions sont activées. Le test pour ce point est très simple:
setlocal DisableExtensions
goto :EOF
Comparez le code précédent contre celui-ci:
setlocal DisableExtensions
exit /B
Cela signifie que GOTO :EOF
retourne à le même point où exit /B
reviendrait.
: eof signifie "Fin de fichier". Il permet de terminer le script sans exécuter aucune des commandes ci-dessous.