|
| Autor |
Nachricht |
matthias
|
Errorlevel in Variable Batch Programmierung
Verfasst am: 11.06.2009, 07:53 |
|
|
DOS erlaubt es leider nicht, den Errorlevel z.B. per ECHO direkt
auf dem Bildschirm auszugeben. Dazu muss diese Information zunaechst
auf irgend eine Weise in eine Variable uebernommen werden.
Zur Loesung des Problems gibt es einmal die brutale Methode:
255 IF-Abfragen mit GOTO zu einem von 255 Labels, wo jeweils der
entsprechende SET-Befehl ausgefuehrt wird.
Auf die etwas feinere Art werden FOR-Schleifen benutzt, mit denen
das Ergebnis schrittweise aus drei Ziffern zusammengesetzt wird.
Um zu verstehen, wie das funktioniert, soll erst mal der Errorlevel
von 0...9 (bzw. 10) ermittelt werden:
| Code: |
FOR %%e in (0 1 2 3 4 5 6 7 8 9) do IF Errorlevel %%e set EL=%%e
::
IF errorlevel 10 set EL=10 oder hoeher
ECHO Errorlevel: %EL%
|
Der Variablen EL werden hier nacheinander die Werte 0,1,2,3...
zugewiesen, aber nur so lange wie die Errorlevel-Abfrage WAHR ist.
Wenn also z.B. der Errorlevel 5 ist, dann passiert in der Schleife
ab 6 nichts mehr, und in der Variablen bleibt 5 haengen.
Im Gegensatz zur IF Errorlevel Abfrage mit GOTO muessen hier also
die Werte in aufsteigender Folge abgefragt werden.
Uebrigens - Immer daran denken: IF Errorlevel n
bedeutet: IF Return-Code >= n
Um zwei Ziffern (also 00..99) zu ermitteln, braucht man auch zwei
Schleifen:
| Code: |
:: Zehner ermitteln
FOR %%z in (0 1 2 3 4 5 6 7 8 9) do IF Errorlevel %%z0 set EL=%%z
:: Einer anhaengen
FOR %%e in (0 1 2 3 4 5 6 7 8 9) do IF Errorlevel %EL%%%e set EL=%EL%%%e
::
IF errorlevel 100 set EL=100 oder hoeher
ECHO Errorlevel: %EL%
|
Die vielen %-Zeichen sind etwas verwirrend, darum hier im Detail:
In der ersten Schleife wird Errorlevel %%z0 abgefragt, also %%z
(aus der Liste) mit einer angehaengten Null - ergibt 00,10,20....
In EL wird aber zunaechst nur die Zehner-Ziffer gespeichert.
In der zweiten Schleife wird Errorlevel %EL%%%e abgefragt, also
zusammengesetzt aus %EL% (der bereits produzierte Zehner) und %%e
(Ziffer aus der Liste).
Dazu ein Hinweis: Umgebungsvariable in einer FOR-Zeile werden von
DOS nur einmalig vor Ausfuehrung der Schleife eingesetzt. Obwohl
also in der zweiten Schleife EL staendig veraendert wird, hat dies
keinen Einfluss mehr auf den dabei verwendeten Wert %EL%.
Die Hunderter koennte man ja nun auf die gleiche Weise ermitteln.
Aber da wird die Sache etwas komplizierter, weil dann zwangslaeufig
Errorlevels ueber 255 abgefragt werden - und dabei gibt
es Probleme: DOS subtrahiert kommentarlos 256.
Die Abfrage IF Errorlevel 260
bewirkt also: IF Errorlevel 4
Aus diesem Grund muss extra dafuer gesorgt werden, dass die
Ziffern-Liste nur (0 1 2 3 4 5) enthaelt, wenn die Schleife ueber
255 hinausgehen wuerde. Dazu wird fuer die Ziffern von 6 bis 9
eine Variable (%!%) verwendet, die bei Bedarf leer bleibt.
Dies ist die komplette Routine:
| Code: |
@echo off
set !=
:: Hunderter
FOR %%h in (0 1 2) do IF Errorlevel %%h00 set EL=%%h
:: & Zehner
IF not Errorlevel 200 set !=6 7 8 9
FOR %%z in (0 1 2 3 4 5 %!%) do IF Errorlevel %EL%%%z0 set EL=%EL%%%z
:: & Einer
IF not Errorlevel 250 set !=6 7 8 9
FOR %%e in (0 1 2 3 4 5 %!%) do IF Errorlevel %EL%%%e set EL=%EL%%%e
::
ECHO Errorlevel: %EL%
set !=
|
Wer das Ganze zu kompliziert findet, kann ja einfach die Routine
ausschneiden und daraus eine BAT-Datei, z.B. ELEVEL.BAT, machen.
Diese kann dann jederzeit nach einem Programm per CALL aufgerufen
werden, um den Errorlevel-Wert auf dem Bildschirm zu zeigen oder
um %EL% sonstwie zu verwenden.
Bitte beachten: die Variablen EL und ! sollten in der aufrufenden
Batch nicht fuer andere Zwecke verwendet werden. EL muss spaeter
noch geloescht werden. |
|
| |
|
 |
|
|
|