DOS und %ERRORLEVEL%

DOS und %ERRORLEVEL%, Teil 1Wie schon erwähnt muss ich mich bei der Arbeit mit Windows rumschlagen. Um Sehnenscheidenentzündungen vorzubeugen verschlägt es mich da bisweilen auch in die Kommandozeile. OK, das ist nicht der einzige Grund. Manchmal will man ja aus einem Skript (leider in diesem Fall kein Perl) heraus einfach mal ein system() aufrufen, und da muss man dann halt DOS-Kommandos absetzen.

Jetzt wollte ich etwas kluges basteln, das testet ob ich eine Datei (schreiben|lesen|löschen) kann. Auf anderen Systemen hätte ich dazu auf etwas in der Form

kommando; echo $?

gesetzt, die Ausgabe könnte ich parsen. Ein Kollege hat für DOS

kommando && echo ok || echo nein

vorgeschlagen, das sollte funktionieren. Prima, Exitcodes kann ich dann offenbar auswerten. Oder?

Um Vielleicht mehr Infos zu kriegen als (tut’s|tut’s nicht) versuche ich folgendes:

kommando & echo %ERRORLEVEL%

Und jetzt bin ich verwirrt (siehe Screenshot):

Das mit && funktioniert scheinbar, die Ausgabe von %ERRORLEVEL% bringt aber nicht sinnvolles? Was wird denn dann von && bzw. || ausgewertet? Und wie zur Hölle kriege ich den wirklichen Exit-Code?!?

DOS und %ERRORLEVEL%, Teil 2Nach etwas mehr Spielerei stelle ich fest, dass in einigen Konstellationen der %ERRORLEVEL% tatsächlich gesetzt wird. Leider immer ein Kommando zu spät, wie man am zweiten Screenshot erkennen kann. Komischerweise funktioniert das aber — wenn man da von ‚funktionieren‘ sprechen kann — auch nur bei Programmaufrufen.

echo > . & echo %ERRORLEVEL%

führt zwar jedes Mal zu einer Fehlermeldung, gibt aber trotzdem nur 0 aus…

Ich beschließe einfach erstmal, das nicht zu verstehen. Mein eigentliches Problem kann ich offenbar unter Windows nicht elegant lösen, also muss ich mir da was anderes ausdenken… :-(

2 Kommentare

  1. Das Problem liegt wohl darin, dass Kommando und die Ausgabe des errorlevel in einer Zeile stehen. In %ERRORLEVEL% steht der Wert, der in dieser Variable gespeichert worden ist, VOR Aufruf der Zeile. In DOS-Batchdateien kann man ja mit mehreren Zeilen arbeiten, kostet ja kein Geld.
    In manchen Fällen kommt man nicht darum herum, die Ausgaben in eine Datei umzuleiten, diese Datei nach bestimmten Suchwörten zu durchsuchen und dann den Errorlevel von „find“ auszuwerten…

    http://www.feldstudie.net/2008/03/14/tutorial-batchscripting-unter-windows/ fand ich gerade beim googlen recht lesenswert.

    Ansonsten ein Beispiel:

    D:\check>type test.bat
    @echo off
    REM help if
    REM help cmd
    REM help …

    :ANFANG
    REM date /t > NUL 2>&1 – gibt das Datum aus und leitet die Ausgabe um Nach NUL
    REM runx > NUL 2>&1 – versucht ein nicht existentes Programm zu starten

    if „%errorlevel%“==“0“ goto OK
    echo Nicht OK!
    goto Ende

    :OK
    echo OK
    goto ENDE

    :ENDE

  2. achso, da ist ein Fehler im Skript: zwischen :ANFANG und if „%errorlevel%“ gehört noch wahlweise „date /t > NUL 2>&1“ oder „runx > NUL 2>&1“, ohne die Gänsefüßchen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

;-) :-) :-D :-| :-/ :-( :-P more »