Wie 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?!?
Nach 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…
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
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.