372 Stimmen

Wie bringe ich eine Batchdatei dazu, bei einem Fehler abzubrechen?

Ich habe eine Batch-Datei, die immer wieder dieselbe ausführbare Datei mit unterschiedlichen Parametern aufruft. Wie kann ich dafür sorgen, dass die Datei sofort beendet wird, wenn einer der Aufrufe einen Fehlercode irgendeiner Stufe zurückgibt?

Im Grunde möchte ich das Äquivalent von MSBuilds ContinueOnError=false .

369voto

system PAUSE Punkte 35068

Prüfen Sie die errorlevel in einem if Anweisung, und dann exit /b (Verlassen Sie die b atch-Datei, nicht den gesamten cmd.exe-Prozess) für andere Werte als 0.

same-executable-over-and-over.exe /with different "parameters"
if %errorlevel% neq 0 exit /b %errorlevel%

Wenn Sie möchten, dass der Wert der Errorlevel außerhalb Ihrer Batchdatei weitergegeben wird

if %errorlevel% neq 0 exit /b %errorlevel%

aber wenn dies innerhalb einer for wird es etwas knifflig. Sie brauchen eher etwas wie:

setlocal enabledelayedexpansion
for %%f in (C:\Windows\*) do (
    same-executable-over-and-over.exe /with different "parameters"
    if !errorlevel! neq 0 exit /b !errorlevel!
)

Bearbeiten: Sie müssen den Fehler nach jedem Befehl überprüfen. In cmd.exe/command.com Batch gibt es keine globale "on error goto"-Konstruktion. Ich habe meinen Code auch aktualisiert per CodeMonkey obwohl ich bei meinen Batch-Hacking-Aktivitäten unter XP oder Vista noch nie auf einen negativen Errorlevel gestoßen bin.

129voto

Benoit Blanchon Punkte 11769

Die kürzeste:

command || exit /b

Bei Bedarf können Sie den Exit-Code festlegen:

command || exit /b 666

Und Sie können auch protokollieren:

command || echo ERROR && exit /b

39voto

Erik Aronesty Punkte 9973

Hier ist ein mehrsprachiges Programm für BASH und Windows CMD, das eine Reihe von Befehlen ausführt und sich beendet, wenn einer davon fehlschlägt:

#!/bin/bash 2> nul

:; set -o errexit
:; function goto() { return $?; }

command 1 || goto :error

command 2 || goto :error

command 3 || goto :error

:; exit 0
exit /b 0

:error
exit /b %errorlevel%

Ich habe diese Art von Dingen in der Vergangenheit für mehrere Plattformen verwendet kontinuierliche Integration Drehbuch.

24voto

Ein kleines Update: Sie sollten die Prüfungen für "if errorlevel 1" wie folgt ändern...

IF %ERRORLEVEL% NEQ 0 

Das liegt daran, dass unter XP negative Zahlen als Fehler auftreten können. 0 = keine Probleme, alles andere ist ein Problem.

Und denken Sie an die Art und Weise, wie DOS die "IF ERRORLEVEL"-Tests behandelt. Es gibt "true" zurück, wenn die Zahl, nach der Sie suchen, diese Zahl oder höher ist. Wenn Sie also nach bestimmten Fehlernummern suchen, müssen Sie mit 255 beginnen und sich nach unten vorarbeiten.

19voto

Xarn Punkte 3261

Ich bevorzuge die OR-Befehlsform, da ich sie am lesbarsten finde (als im Gegensatz zu einem "if" nach jedem Befehl). Allerdings ist die naive Art der dies zu tun, command || exit /b %ERRORLEVEL% es falsch .

Dies liegt daran, dass die Batch-Variablen beim ersten Lesen einer Zeile expandiert werden, anstatt und nicht, wenn sie verwendet werden. Das bedeutet, dass wenn die command auf der Linie scheitert, wird die Batchdatei zwar ordnungsgemäß beendet, aber mit dem Rückgabewert 0, denn das ist der Wert von %ERRORLEVEL% war zu Beginn des Linie. Offensichtlich ist dies in unserem Skript unerwünscht, daher müssen wir verzögerte Expansion , etwa so:

SETLOCAL EnableDelayedExpansion

command-1 || exit /b !ERRORLEVEL!
command-2 || exit /b !ERRORLEVEL!
command-3 || exit /b !ERRORLEVEL!
command-4 || exit /b !ERRORLEVEL!

Dieses Snippet führt die Befehle 1-4 aus, und wenn einer von ihnen fehlschlägt, wird es mit demselben Exit-Code wie der fehlgeschlagene Befehl beendet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X