Wie kann ich eine Batch-Datei innerhalb einer Funktion beenden?

8

Ich habe eine einfache Funktion geschrieben, um nach Verzeichnissen zu suchen:

%Vor%

: Ende wird als

geschrieben %Vor%

Ich verstehe nicht, warum das Programm nicht aufhören würde, nachdem goto: end aufgerufen wurde. Ich habe eine andere Funktion, die die gleiche Methode verwendet, um das Programm zu stoppen, und es funktioniert gut.

%Vor%

In diesem Fall wird das Programm nach dem Aufruf beendet: end; Warum würde das nicht funktionieren in: Direxist? Danke für Ihre Hilfe!

    
Brad Conyers 10.05.2012, 13:21
quelle

4 Antworten

12

Ich nehme an, Sie mischen call und goto Anweisungen hier.

Ein Label in einer Batchdatei kann mit call oder goto verwendet werden, aber das Verhalten ist anders.
Wenn Sie call so eine Funktion haben, wird sie zurückgegeben, wenn die Funktion das Ende der Datei erreicht hat oder eine explizite exit /b oder goto :eof (wie Ihre goto :end ).

Daher können Sie Ihren Stapel nicht abbrechen, wenn Sie ein Etikett als Funktion verwenden.

Allerdings wird goto für ein Label nicht an den Aufrufer zurückgeben

Aber es gibt auch eine Möglichkeit, den Stapel von einer Funktion zu beenden.
Sie können einen Syntaxfehler erstellen, wodurch der Stapel angehalten wird.

%Vor%     
jeb 10.05.2012, 13:44
quelle
5

Jebs Lösung funktioniert großartig. Aber es mag nicht unter allen Umständen angebracht sein. Es hat zwei mögliche Nachteile:

1) Der Syntaxfehler stoppt die all Stapelverarbeitung. Wenn also ein Stapelscript Ihr Skript aufgerufen hat und Ihr Skript mit dem Syntaxfehler angehalten wurde, wird die Kontrolle nicht an den Aufrufer zurückgegeben. Das könnte schlecht sein.

2) Normalerweise gibt es ein implizites ENDLOCAL für jedes SETLOCAL, wenn die Stapelverarbeitung endet. Der schwerwiegende Syntaxfehler beendet jedoch die Stapelverarbeitung ohne das implizite ENDLOCAL ! Dies kann unangenehme Folgen haben :-( Siehe meine DosTips-Post SETLOCAL fährt nach Batch-Beendigung fort! für mehr Informationen.

Aktualisierung 2015-03-20 Siehe Ссылка für einen sauberen Weg, um sofort alle Batch-Verarbeitung zu beenden.

Die andere Möglichkeit, eine Batchdatei innerhalb einer Funktion anzuhalten, ist die Verwendung des Befehls EXIT, mit dem die Befehlsshell vollständig beendet wird. Aber ein wenig kreative Verwendung von CMD kann es nützlich machen, um das Problem zu lösen.

%Vor%

Ich habe sowohl meine Version namens "daveExit.bat" als auch Jebs Version namens "jebExit.bat" auf meinem PC.

Ich teste sie dann mit diesem Batch-Skript

%Vor%

Und hier sind die Ergebnisse

%Vor%

Ein möglicher Nachteil der EXIT-Lösung ist, dass Änderungen an der Umgebung nicht erhalten bleiben. Dies kann teilweise dadurch gelöst werden, dass der Environent vor dem Beenden in eine temporäre Datei geschrieben und dann wieder eingelesen wird.

%Vor%

Aber Variablen mit Newline-Zeichen (0x0A) im Wert werden nicht richtig erhalten.

    
dbenham 10.05.2012 15:33
quelle
1

Hier ist meine Lösung, die verschachtelte Routinen unterstützt, wenn alle auf Fehlerlevel überprüft werden Ich füge den Test für unrolevel bei allen meinen Anrufen (intern oder extern) hinzu

%Vor%     
Charles Godwin 08.01.2013 19:29
quelle
1

Wenn Sie exit /b X zum Beenden der Funktion verwenden, wird ERRORLEVEL auf den Wert von X gesetzt. Sie können dann || Bedingtes Verarbeitungssymbol , um einen Befehl auszuführen, wenn ERRORLEVEL ungleich Null ist.

%Vor%

Ausgabe von diesem Skript ist:

%Vor%     
GrahamS 06.04.2017 10:34
quelle

Tags und Links