Windows:ERRORLEVEL
Aus znilwiki
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.