Batch – if errorlevel

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.

4 Kommentare

  1. Apropos Anfängerfehler:
    Wirklich ganz korrekt müsste es lauten:

    md c:checkdir
    if errorlevel 1 goto fehler
    echo befehl erfolgreich
    goto ende
    :fehler
    echo befehl nicht erfolgreich 
    :ende
    
  2. 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.

    if errorlevel 1

    prüft den Fehlercode des vorherigen Befehls auf 1 und höher.

    if errorlevel 3

    reagiert auf 3 und größer. Wenn ein Programm nun einen hohen Exit Code zurückgibt, beispielsweise msiexec mit 1603, würden alle

    if errorlevel

    Überprüfungen kleiner als 1603 anspringen.
    Außer man nutzt

    if errorlevel 1603 if not errorlevel 1604

    um den Fehler „einzukesseln“.

    Das ist natürlich schwachsinnig, weshalb

    if errorlevel X

    nicht zu empfehlen ist.

    Stattdessen ist der String Vergleich zu empfehlen:

    cscript.exe mxscript.vbs
    if %errorlevel%==2 goto x

    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:

    cscript.exe script.vbs
    set myscriptEL=%errorlevel%
    if %myscriptEL%==1 echo x
    if %myscriptEL%==2 echo x
    if %myscriptEL%==3 echo x
    echo return code was: %myscriptEL%

    Aber Achtung, die Variable zum Zwischenspeichern nicht „errorlevel“ nennen, das geht schief.

    Mehr Infos.

  3. Pingback: Anonymous

Schreibe einen Kommentar