2010-09-14 9 views
25

den folgenden Code Gegeben:Subroutinen in Batch-Dateien

@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 

Ich erwarte, dass diese Ausgabe:

Start 
Calling SUB_A 
In SUB_A 
Calling SUB_B 
In SUB_B 
End 

Aber ich bekomme diese:

Start 
Calling SUB_A 
In SUB_A 
Calling SUB_B 
In SUB_B 
In SUB_A 

Was mache ich falsch hier?

Antwort

14

Die Linie CALL :SUB_B kehrt, geht das Skript in den nächsten paar Zeilen:

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

Sie benötigen einen GOTO:EOF nach dem Aufruf eingefügt werden, wenn Sie es dort aufhören wollen.

Batch-Dateien sind keine strukturierten Programme; Sie sind eine Abfolge von Anweisungen mit einer BASIC-ähnlichen Einrichtung für GOTO und CALL.

3

Nach Ihrer Zeile CALL :SUB_B fällt die Stapeldatei durch SUB_A. Wenn Sie es nicht wollen, müssen Sie eine GOTO Zeile dort setzen.

42

Wenn Sie von einem CALL zurückkehren möchten, verwenden Sie den EXIT-Befehl mit dem Argument/B (da nur "EXIT" die Batch-Datei beendet).

Zum Beispiel:

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

Das finde ich besser, 'goto: EOF', wie Sie einen Rückgabewert als Error-hinzufügen:' exit/B% RetVal% ' – SvenS

+6

Ein Hinweis - Sie sollten nicht definieren' EOF-Label. 'GOTO: EOF' funktioniert out of the box. Beachten Sie auch, dass Sie ': EOF' aufrufen und nur' EOF' definieren können, das von 'GOTO EOF' aufgerufen würde. – Nux

Verwandte Themen