Aktionen

Windows:ERRORLEVEL

Aus znilwiki

Version vom 21. Januar 2012, 23:50 Uhr von BLinz (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

In vielen Batchdateien wird der Inhalt der Umgebungsvariablen %ERRORLEVEL% geprüft um den Erfolg oder Misserfolg von Anweisung zu prüfen. Ein Beispiel:

C:\>dir test
 Datenträger in Laufwerk C: ist DISK
 Volumeseriennummer: 0000-0000

 Verzeichnis von C:\test

12.04.2011  17:44    <DIR>          .
12.04.2011  17:44    <DIR>          ..
               0 Datei(en),              0 Bytes
               2 Verzeichnis(se), 61.556.363.264 Bytes frei

C:\>echo %ERRORLEVEL%
0

C:\>dir test2
 Datenträger in Laufwerk C: ist DISK
 Volumeseriennummer: 0000-0000

 Verzeichnis von C:\

Datei nicht gefunden

C:\>echo %ERRORLEVEL%
1

Wir können sehen, das die Umgebungsvariable %ERRORLEVEL beim erfolgreichen Ausführen des dir Befehls die 0 enthält, bei einem Fehler die 1.
So, wir wollen das in einer Batch-Datei auswerten - da bietet sich doch der If Befehl an. Ein kurzer Blick in die Hilfe zeigt, das dieser sogar den Parameter ERRORLEVEL direkt kennt: (Auszug aus der Windows Hilfe)

if [not] errorlevel Zahl Befehl [else Ausdruck]

Parameter

not --- Gibt an, dass der Befehl nur dann ausgeführt werden soll, wenn die Bedingung nicht erfüllt ist.
errorlevel Zahl --- Gibt nur dann eine wahre Bedingung an, wenn das zuvor durch Cmd.exe ausgeführte Programm einen Beendigungscode gleich oder größer als Zahl zurückgegeben hat.
Befehl --- Gibt den Befehl an, der ausgeführt werden soll, wenn die vorangehende Bedingung erfüllt ist.

Na dann probieren wir das mit dem vorherigem Beispiel noch mal aus:

C:\>dir test
 Datenträger in Laufwerk C: ist DISK
 Volumeseriennummer: 0000-0000

 Verzeichnis von C:\test

12.04.2011  17:44    <DIR>          .
12.04.2011  17:44    <DIR>          ..
               0 Datei(en),              0 Bytes
               2 Verzeichnis(se), 61.556.363.264 Bytes frei

C:\>if errorlevel=1 echo Ist Eins!
 
C:\Users\BLinz\Desktop>dir test2
 Datenträger in Laufwerk C: ist DISK
 Volumeseriennummer: 0000-0000

 Verzeichnis von C:\

Datei nicht gefunden

C:\>if errorlevel=1 echo Ist Eins!
Ist Eins!

Na ist doch alles Wunderbar oder? NEIN!

Warum? na da machen wir einfach mal folgendes:

C:\>find /i "ja" test.txt

---------- TEST.TXT
ja

C:\>if errorlevel=1 echo Ist Eins!

C:\>echo %ERRORLEVEL%
0

C:\>set errorlevel=1

C:\>find /i "ja" test.txt
 
 ---------- TEST.TXT
 ja

C:\>if errorlevel=1 echo Ist Eins!

C:\>echo %ERRORLEVEL%
1

Nanu? Kein Fehler bei if errorlevel=1 ... aber in in der Umgebungsvariable %ERRORLEVEL% steht immer noch 1 ???? Tja, über diese Tatsache bin ich schon öfters gestolpert - so in der Eingabeaufforderung funktionert noch alles - aber in der Batch klappen die Abfragen nicht. Weil andere Teile der Batch / andere Befehle zuvor den Wert verändert haben.

Und nun? Naja - eigentlich ignorieren - aber wenn es in der Batch zu Fehler kommt die Methode tauschen. Keine von beiden läuft immer in allen Szenarieren.

also statt If ERRORLEVEL=1 einfach ein If %ERRORLEVEL%=1 oder umgekehrt. Und denkt an die doppelten "==" in Batchdateien :-)

Im Zweifel kann ein

Set errorlevel=

das ganze wieder zurück auf die gewünschte Spur bringen.

Loading comments...