2016-05-29 6 views
13

Ich versuche zu verstehen, wo im Code genau GOTO :EOF zurück zu? HierWohin geht GOTO: EOF?

ist der 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 

Antwort

25

:EOF ist ein vordefiniertes Etikett, wie Microsoft in der Dokumentation für den Befehl GOTO erklärt. Die Hilfeausgabe durch Ausführen in einem Eingabeaufforderungsfenster goto /? erklärt auch dieses spezielle Etikett für End Of File. Dieses vordefinierte Label wird jedoch nur unterstützt, wenn die Befehlserweiterungen standardmäßig aktiviert sind.

Die Hilfe Ausgabe von in einem Eingabeaufforderungsfenster ausgeführt call /? und natürlich auch die Dokumentation für den Befehl CALL erklärt beide, dass goto :EOF mit call :Label genannt einem Unterprogramm beenden verwendet werden soll.

Eine Subroutine ist nichts anderes als eine andere Batch-Datei, die in die aktuelle Batch-Datei eingebettet ist und mit dem Befehl call aufgerufen wird. Wenn sich das Unterprogramm am Ende der Stapeldatei befindet, markiert das reale Ende der Datei das Ende des Unterprogramms.

Aber es kann mehrere Unterprogramme in einer Batchdatei geben.

Es wird also ein Befehl benötigt, damit der Befehlsinterpreter das Unterprogramm beim Erreichen einer bestimmten Zeile in der Befehlsverarbeitung verlassen und zum aufrufenden Befehlsprozess zurückkehren kann. goto :EOF sowie exit /B können überall verwendet werden, um entweder ein Unterprogramm zu verlassen oder die aktuelle Stapelverarbeitung zu beenden.

Im Batch-Code in Frage der erstegoto :EOF wird benötigt, um Ausgang Batch-Datei Verarbeitung ohne einen unerwünschten Rückgang bis zum Unterprogramm-Code nach der Schleife beenden.

Die zweitegoto :EOF in Chargenbezeichnung von Frages für das Unterprogramm verlass und weiterhin die Verarbeitung in FOR-Schleife in der zweiten Linie. Die Verarbeitung der Batchdatei wird nicht beendet, sondern nur die Unterroutine.

Anmerkung 1:goto EOF ohne Doppelpunkt setzt voraus, dass es wirklich eine Linie mit :EOF in der Batch-Datei starten ist, das heißt, die Sprungmarke EOF muss in der Datei vorhanden ist. goto :EOF führt immer zum Beenden der Unterroutine/Stapelverarbeitung mit aktivierten Befehlserweiterungen, auch wenn in der Stapeldatei ein Label EOF vorhanden ist, da eine Zeile mit :EOF beginnt.

Anmerkung 2: Befehl EXIT ohne Parameter /B Ergebnisse immer in unabhängigen gesamten Befehlsverarbeitung Verlassen auf Hierarchie aufrufen und unabhängig, wie der Befehl interpeter gestartet wurde mit dem Parameter /K (halten offen, wie verwendet, wenn Sie eine Eingabeaufforderung öffnen) oder mit /C (schließen nachdem die Befehlsbearbeitung beendet wurde, wie beim Doppelklicken auf eine Batch-Datei). Daher sollte 10 ohne /B mit Bedacht in einer Batch-Datei verwendet werden (am besten: nie).

Anmerkung 3:exit /B nicht mit Befehlserweiterungen deaktiviert arbeiten, wie durch diesen Code demonstriert:

@echo off 
setlocal DisableExtensions 
echo Use command exit /B with command extensions disabled. 
exit /B 

Ausführung dieser Batch-Datei aus einem Fenster der Eingabeaufforderung erhalten Sie eine Ausgabe der Fehlermeldung:

Das System kann nicht die Batch-Label finden angegeben - EOF

Mit anderen Worten: exit /B ist genau wie goto :EOF und hängt daher auch von Befehlserweiterungen ab. ohne /B funktioniert immer.

Anmerkung 4:ERRORLEVEL wird nicht von goto :EOF betroffen, aber die Microsoft GOTO Dokumentation zu diesem Thema stumm. exit /B # setzt ERRORLEVEL zu as documented von Microsoft. Das explizite Beenden einer Stapeldatei mit einem bestimmten Beendigungscode ist jedoch normalerweise nicht erforderlich, da weder goto :EOF noch exit /B den aktuellen Wert ERRORLEVEL ändern.

Einzelheiten zu ERRORLEVEL Verhalten siehe:

+0

Vielen Dank! – s6398197atuser

+1

Der Hilfetext, der beim Eingeben von 'cmd /?' Erscheint, listet "alle" Befehle auf, die durch Befehlserweiterungen bewirkt werden, aber 'exit' ist * nicht * erwähnt; Danke, dass du das gezeigt hast! – aschipfl

0

: eof bedeutet "Ende der Datei". Es wird verwendet, um das Skript zu beenden, ohne einen der folgenden Befehle auszuführen.

+0

Dank! Aber wie kommt es dann zur Schleife? das 2. GOTO sagt auch: eof wollte GOTO nicht sagen: DO zum Beispiel? – s6398197atuser

+3

@ s6398197atuser 'call' erzeugt einen Child-Thread und die Ausführung des aktuellen Thread pausiert, bis' call' beendet ist. 'call: subroutine' läuft so lange, bis die eigene' exit/b' oder EOF erreicht ist. Zu diesem Zeitpunkt wird die Ausführung beim Aufrufer fortgesetzt. Lassen Sie das Echo eingeschaltet und Sie können die Reihenfolge beobachten, in der Befehle ausgeführt werden, und hoffentlich wird es ein wenig mehr Sinn ergeben. [Siehe diese Seite] (http://www.dostips.com/DtTutoFunctions.php) (http://www.dostips.com/DtTutoFunctions.php) für weitere Informationen zu "Anruf" und [diese Seite] (http://www.dostips.com/DtTutoFunctions.php) für eine Tutorial über Batch-Skript-Funktionen. – rojo

+0

@Micho, vielen Dank, ich denke, ich habe es! – s6398197atuser

5

GOTO :EOF ist funktional gleichwertig zu exit /B, aber beide Formen funktionieren nur, wenn Erweiterungen aktiviert sind. Der Test für diesen Punkt ist sehr einfach:

setlocal DisableExtensions 
goto :EOF 

vorherigen Code Vergleich mit dieser:

setlocal DisableExtensions 
exit /B 

Das bedeutet, dass GOTO :EOF kehrt zu den gleichen Punkt wo exit /B zurückkehren würde.

Verwandte Themen