if errorlevel
hilft beim Batchscripting um Fehler während der Ausführung eines Befehls abzufangen. Hier verbirgt sich aber ein Anfängerfehler, über den jeder mal stolpert.
Ein Befehl, der ausgeführt wird, gibt normalerweise einen Wert zurück, wenn er fertig ausgeführt wurde. Dieser Rückgabewert ist normalerweise 0, wenn der Befehl erfolgreich ausgeführt wurde. Fehler werden mit einem positiven Rückgabewert ungleich 0 angegeben. Viele Programme haben für verschiedene Fehler auch verschiedene Rückgabewerte, diese muss uns aber nicht weiter interessieren.
Mit
if errorlevel
fragen wir den Rückgabewert des zuvor ausgeführten Befehls ab.
Ein Beispiel:
md c:\checkdir if errorlevel 0 echo Test
Was macht diese Befehlskombi? Man könnte denken der Rückgabewert von md (makedir – Verzeichnis erstellen) wird geprüft und wenn der Befehl erfolgreich ausgeführt wurde (errorlevel 0) dann wird „Test“ ausgegeben.
Stattdessen wird aber immer „Test“ ausgegeben, egal ob der Befehl erfolgreich ausgeführt wurde oder nicht. Warum?
Geprüft wird nicht
if errorlevel = X
sondern
if errorlevel >= X
! Demzufolge prüft
if errorlevel 0
nicht nur auf den Wert 0 sondern prüft mit >= 0 auch alle Werte, die größer sind als 0.
Das heißt egal ob ein Programm 0 zurück gibt, 1 oder 213, der Befehl hinter
if errorlevel 0
wird immer ausgeführt.
Korrekt müsste es lauten:
md c:\checkdir if errorlevel 1 goto fehler echo befehl erfolgreich :fehler echo befehl nicht erfolgreich
Alle Rückgabewerte >= 1 (nicht erfolgreich) werden nun also an die „fehler“ Sprungmarke geschickt. Der Ablauf des erfolgreichen Programmteils erfolgt normal unter der errorlevel Abfrage.
Wichtig ist, dass ihr die Abfrage des Errorlevels ausführlich in eurer Situation testet – der Abfragerückgabewert ist in speziellen Situationen nicht sehr zuverlässig und kann durch andere Komponenten und Code variieren.
Apropos Anfängerfehler:
Wirklich ganz korrekt müsste es lauten:
Selbstverständlich ist dieser Code nicht vollständig; es ist ein stark vereinfachtes Beispiel nur zur Veranschaulichung.
Ich würde die Verwendung von „if errorlevel X“ sowieso nicht mehr empfehlen. Diese Methode ist schwer verständlich und unhandlich.
prüft den Fehlercode des vorherigen Befehls auf 1 und höher.
reagiert auf 3 und größer. Wenn ein Programm nun einen hohen Exit Code zurückgibt, beispielsweise msiexec mit 1603, würden alle
Überprüfungen kleiner als 1603 anspringen.
Außer man nutzt
um den Fehler „einzukesseln“.
Das ist natürlich schwachsinnig, weshalb
nicht zu empfehlen ist.
Stattdessen ist der String Vergleich zu empfehlen:
Dieser Code testet den Fehlercode ebenso, ist aber einfacher zu nutzen.
Wenn man mehrere Fehlercodes testen möchte, und auch aus vielen anderen Gründen, empfiehlt sich das Zwischenspeichern des Return Codes:
Aber Achtung, die Variable zum Zwischenspeichern nicht „errorlevel“ nennen, das geht schief.
Mehr Infos.