2010-09-14 12 views
25

Étant donné le code suivant:Subroutines dans des fichiers batch

@Echo off 
ECHO Start 
ECHO Calling SUB_A 
CALL :SUB_A 
ECHO Calling SUB_B 
CALL :SUB_B 

:SUB_A 
    ECHO In SUB_A 
    GOTO:EOF 

:SUB_B 
    ECHO In SUB_B 
    GOTO:EOF 

ECHO End 

J'attends cette sortie:

Start 
Calling SUB_A 
In SUB_A 
Calling SUB_B 
In SUB_B 
End 

Mais je reçois ceci:

Start 
Calling SUB_A 
In SUB_A 
Calling SUB_B 
In SUB_B 
In SUB_A 

Qu'est-ce que je fais mal ici?

Répondre

14

La ligne CALL :SUB_B retours, le script procède aux lignes suivantes:

:SUB_A   # no effect from this one 
ECHO In SUB_A # prints message 

Vous devez insérer un GOTO:EOF après l'appel si vous voulez arrêter là.

fichiers batch ne sont pas des programmes structurés; ils sont une séquence d'instructions avec des fonctionnalités de type BASIC pour GOTO et CALL.

3

Après votre ligne CALL :SUB_B le fichier de commandes tombe jusqu'à SUB_A. Si vous ne voulez pas à, vous avez besoin de mettre une ligne là GOTO.

42

Si vous voulez revenir d'un appel, vous utilisez la commande EXIT avec l'argument/B (comme « EXIT » seul mettra fin au fichier batch).

Par exemple:

CALL :SUB_ONE 
CALL :SUB_TWO 

GOTO :EOF 

:SUB_ONE 
ECHO Hello from one 
EXIT /B 

:SUB_TWO 
ECHO Hello from two 
EXIT /B 

:EOF 
+5

Je trouve cela préférable de 'goto: EOF' que vous pouvez ajouter une valeur de retour comme ERRORLEVEL:' sortie/B% RetVal% ' – SvenS

+6

Une note - vous ne devriez pas définir' EOF' label. 'GOTO: EOF' fonctionne hors de la boîte. Notez également que vous appelez ': EOF' et vous ne pouvez définir' EOF' qui serait appelé par 'GOTO EOF'. – Nux

Questions connexes