Wie kann ich eine Batch-Datei aus einem Unterprogramm heraus beenden?
Wenn ich den Befehl EXIT verwende, kehre ich einfach zu der Zeile zurück, in der ich die Unterroutine aufgerufen habe, und die Ausführung wird fortgesetzt.
Hier ist ein Beispiel:
@echo off
ECHO Quitting...
CALL :QUIT
ECHO Still here!
GOTO END
:QUIT
EXIT /B 1
:END
EXIT /B 0
Ausgabe:
Quitting...
Still here!
Aktualisieren:
Dies ist keine richtige Antwort, aber am Ende habe ich Folgendes getan:
@echo off
CALL :SUBROUTINE_WITH_ERROR || GOTO HANDLE_FAIL
ECHO You shouldn't see this!
GOTO END
:SUBROUTINE_WITH_ERROR
ECHO Simulating failure...
EXIT /B 1
:HANDLE_FAIL
ECHO FAILURE!
EXIT /B 1
:END
ECHO NORMAL EXIT!
EXIT /B 0
Die Double-Pipe-Aussage von:
CALL :SUBROUTINE_WITH_ERROR || GOTO HANDLE_FAIL
ist eine Abkürzung für:
CALL :SUBROUTINE_WITH_ERROR
IF ERRORLEVEL 1 GOTO HANDLE_FAIL
Ich würde immer noch gerne wissen, ob es eine Möglichkeit gibt, direkt aus einem Unterprogramm auszusteigen, anstatt den CALLER mit der Situation fertig werden zu lassen, aber dies erledigt zumindest die Aufgabe.
Update # 2: Beim Aufruf eines Unterprogramms aus einem anderen Unterprogramm, das wie oben beschrieben aufgerufen wurde, rufe ich aus dem Unterprogramm folgendermaßen auf:
CALL :SUBROUTINE_WITH_ERROR || EXIT /B 1
Auf diese Weise breitet sich der Fehler sozusagen bis zum "Haupt" aus. Der Hauptteil der Charge kann dann den Fehler mit der Fehlerbehandlungsroutine GOTO: FAILURE behandeln
GOTO :EOF
%~0
auf die Variable statttrue
:if not "%selfwrapped%"=="%~0" ( set selfwrapped=%~0 .... )
. Auf diese Weise können Sie denselben Trick in mehreren Stapelskripten verwenden, die sich gegenseitig aufrufen.%~0
) mit allen Argumenten (%*
) aus einer verschachtelten cmd.exe, und die/s
verwendet wird , um die Art und Weise , die zu steuern%ComSpec%
Argument Griff die doppelten Anführungszeichen um die Anruf.Wie wäre es mit dieser kleinen Anpassung?
Ausgabe:
Technisch gesehen verlässt dies das Unterprogramm nicht. Vielmehr prüft es einfach das Ergebnis des Unterprogramms und ergreift von dort aus Maßnahmen.
quelle
Wenn Sie nicht von der Prozedur zurückkehren möchten, verwenden Sie nicht
call
: stattdessengoto
.quelle
Ich habe die Fehlerbehandlung in meine Batch-Dateien eingefügt. Sie können Fehlerbehandlungsroutinen wie diese aufrufen:
Und hier ist das Ende der Batch-Datei:
quelle
Dadurch wird der aktuelle Kontext und ein übergeordneter Kontext beendet (dh, wenn er in einem
call
einstufigen Subroutinenskript ausgeführt wird, wird er beendet):Oder, wenn Sie Fehlerlevel 0 benötigen:
Grundsätzlich wird
(goto) 2>nul
die Fehlerebene auf 1 gesetzt (ohne dass ein Fehler ausgegeben wird) und die Ausführung an den übergeordneten Kontext und den Code zurückgegeben, nachdem die doppelte Pipe im übergeordneten Kontext ausgeführt wurde.type nul>nul
setzt errorlevel auf 0UPD:
Um die Ausführung mehr als zweimal hintereinander zurückzugeben, verketten Sie mehrere
(goto) 2>nul ||
wie folgt:Hier ist eine rekursive Subroutine, mit der der Kontext eine variable Anzahl von Malen zurückgegeben werden kann:
Beim Aufruf von einer rekursiven Funktion:
die Ausgabe wird sein:
quelle