web-dev-qa-db-fra.com

Où retourne GOTO: EOF?

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
23
s6398197atuser

: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:

47
Mofi

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 exit /B reviendrait.

6
Aacini

: eof signifie "Fin de fichier". Il permet de terminer le script sans exécuter aucune des commandes ci-dessous.

0
Micho