IF ERRORLEVEL

Du hast eine Frage aber bist neu im Thema?
Antworten
Merlin
Windows 3.11-Benutzer
Beiträge: 8
Registriert: Mo 19. Feb 2007, 14:21

IF ERRORLEVEL

Beitrag von Merlin »

Hallo zusammen,
ich habe eine Frage zur Benutzung von IF ERRORLEVEL

Also, ich habe in einer Batch mehrere Befehle. Es könnte möglich sein, dass jeder Befehl auf einen Fehler laufen könnte.

Muss ich nun vor jeder Befehlszeile IF ERRORLEVEL 1 Goto Fehler schreiben, oder genügt es an erste Stelle diese Anweisung zu schreiben?
Sodass nach Fehler verzweigt wird, auch wenn nur z.B. die zweite Anweisung einen Fehler hat...

Schon mal Danke für eure Hilfe
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: IF ERRORLEVEL

Beitrag von DOSferatu »

Zu beachten ist:
Der Befehl IF ERRORLEVEL Zahl ...
verzweigt, wenn ERRORLEVEL größer oder gleich Zahl (also 0 bis 255) ist.
Daher, wenn man mehrere IF ERRORLEVEL Abfragen machen will, ist es nötig, diese "rückwärts" zu machen. Beispiel:

Code: Alles auswählen

IF ERRORLEVEL 5 goto fuenf
IF ERRORLEVEL 4 goto vier
IF ERRORLEVEL 3 goto drei
IF ERRORLEVEL 2 goto zwei
IF ERRORLEVEL 1 goto eins
:null
Hier das machen, was passieren soll, wenn ERRORLEVEL=0 ist.
goto ende
:eins
Hier das machen, was passieren soll, wenn ERRORLEVEL=1 ist.
goto ende
:zwei
Hier das machen, was passieren soll, wenn ERRORLEVEL=2 ist.
goto ende
:drei
Hier das machen, was passieren soll, wenn ERRORLEVEL=3 ist.
goto ende
:vier
Hier das machen, was passieren soll, wenn ERRORLEVEL=4 ist.
goto ende
:fuenf
Hier das machen, was passieren soll, wenn ERRORLEVEL=5 ist.
:ende
Achja: Falls echtes DOS verfügbar ist, kann der Befehl HELP helfen.
(Oder HELP BEFEHL, also in dem Fall z.B. HELP IF.)
Merlin
Windows 3.11-Benutzer
Beiträge: 8
Registriert: Mo 19. Feb 2007, 14:21

Re: IF ERRORLEVEL

Beitrag von Merlin »

ich meinete die Frage anderst...

copy x y
copy a b
....
IF ERRORLEVEL

Muss ich hinter jeder Zeile IF ERRORLEVEL setzten, damit die nächsten nicht mehr verarbeitet werden oder wie löse ich das...?
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: IF ERRORLEVEL

Beitrag von DOSferatu »

Um einen Berich nicht zu verarbeiten, kann man ihn einfach überspringen oder "auskommentieren". Beim Auskommentieren (mit REM vor jeder Zeile) wird diese NIE ausgeführt.
Überspringen geht ganz einfach mit GOTO. Alle Befehle, die man normal benutzen kann, kann man auch hinter den IF Befehlen benutzen und umgekehrt.
Also:

Code: Alles auswählen

Befehl1
goto hierhin
Befehl2
:hierhin
Befehl3
Damit werden Befehl1 und Befehl3 ausgeführt, Befehl2 wird übersprungen. (Natürlich kann man auch mehrere Befehle überspringen.) Das Sprungziel wird eben mit Doppelpunkt und Namen angegeben (als "Sprunglabel"). Innerhalb von Befehlen nur mit Namen, ohne Doppelpunkt.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: IF ERRORLEVEL

Beitrag von freecrac »

Merlin hat geschrieben:ich meinete die Frage anderst...

copy x y
copy a b
....
IF ERRORLEVEL

Muss ich hinter jeder Zeile IF ERRORLEVEL setzten, damit die nächsten nicht mehr verarbeitet werden oder wie löse ich das...?
Hinter jeder Zeile die einen Fehler verursachen könnte und dieses mit einem Errorlevel ungleich Null signalisiert muss man ggf. mindestens eine "IF ERRORLEVEL"-Abfrage plazieren, um einen möglichen Fehler abfangen zu können.
Bei jedem Copy-Befehl (und auch bei sehr vielen DOS-Anwendungen) wird entweder als Errorlevel eine Null zurückgeleifert, oder im Falle einer Fehlfunktion ggf. einen höheren Wert bis 255.
Werden zwei Copy-Befehle unmittelbar direkt hintereinander ausgeführt, wie es hier im Beispiel zu sehen ist, dann überschreibt der letzte Befehl den Errorlevel.
Möchte man einen möglichen Fehler vom ersten Copy-Befehl auswerten, dann muss das unmittelbar danach passieren, noch bevor ein anderer Befehl den Errorlevel überschreibt.
Möchte man den genauen Wert des aktuellen Errorlevels herausbekommen, dann muss man dieses (wie "DOSferatu" es schon erwähnt hat) in absteigender Reihenfolge tun, so das man mit dem höchstmöglichen Wert, den man als Errrorlevel zurückgeliefert bekommen kann, mit der Abfrage beginnen.

Gibt es eigentlich ein triftigen Grund warum man den Errorlevel nicht in beliebiger Reihenfolge abfragen kann, was haben sich die Programmieren von MS dabei nur gedacht es so umständlich zu gestalten?

Code: Alles auswählen

if errorlevel 4 goto vier
if errorlevel 3 goto drei
if errorlevel 2 goto zwei
if errorlevel 1 goto eins
goto MARKE

:eins
Echo Fehler eins
goto Raus

:zwei
Echo Fehler zwei
goto Raus

:drei
Echo Fehler drei
goto Raus

:vier
Echo Fehler vier
goto Raus

:MARKE
Echo Es ist kein Fehler aufgetreten.

:RAUS
Wenn man allerdings so alle 255 Werte abfragen möchte, dann wird das Listing aber ganz schön lang.

Eine kompaktere Lösung habe ich hier gefunden:
http://www.robvanderwoude.com/errorlevel.php

Code: Alles auswählen

@ECHO OFF
REM Reset variables
FOR %%A IN (1 10 100) DO SET ERR%%A=

REM Check error level hundredfolds
FOR %%A IN (0 1 2) DO IF ERRORLEVEL %%A00 SET ERR100=%%A
IF %ERR100%==2 GOTO 200
IF %ERR100%==0 IF NOT "%1"=="/0" SET ERR100=

REM Check error level tenfolds
FOR %%A IN (0 1 2 3 4 5 6 7 8 9) DO IF ERRORLEVEL %ERR100%%%A0 SET ERR10=%%A
IF "%ERR100%"=="" IF %ERR10%==0 SET ERR10=

:1
REM Check error level units
FOR %%A IN (0 1 2 3 4 5) DO IF ERRORLEVEL %ERR100%%ERR10%%%A SET ERR1=%%A
REM Modification necessary for errorlevels 250+
IF NOT ERRORLEVEL 250 FOR %%A IN (6 7 8 9) DO IF ERRORLEVEL %ERR100%%ERR10%%%A SET ERR1=%%A
GOTO End

:200
REM In case of error levels over 200 both
REM tenfolds and units are limited to 5
REM since the highest DOS error level is 255
FOR %%A IN (0 1 2 3 4 5) DO IF ERRORLEVEL 2%%A0 SET ERR10=%%A
IF ERR10==5 FOR %%A IN (0 1 2 3 4 5) DO IF ERRORLEVEL 25%%A SET ERR1=%%A
IF NOT ERR10==5 GOTO 1

:End
REM Clean up the mess and show results
SET ERRORLEV=%ERR100%%ERR10%%ERR1%
FOR %%A IN (1 10 100) DO SET ERR%%A=
ECHO ERRORLEVEL  %ERRORLEV%
Hinweis zur Errorlevel-Abfrage von Microsoft:
http://support.microsoft.com/kb/504265/de

Noch eine hilfreiche Seite zum Thema:
http://www.antonis.de/dos/batchtut/pittipla/index.htm

...

Wo kann man eigentlich eine Liste der Errorlevel und deren Bedeutung für die verschiedenen (auch internen) DOS-Befehle finden?

Edit: Bisher habe ich nur eine kleine Liste von nur wenigen "FreeDOS style errorlevels" gefunden:
http://www.freedos.org/freedos/news/technote/207.html

EDIT2:
Nun habe ich eine weitere Liste von ERRORLEVELs (allerdings nur nur für DOS 7 "Windows 95/98/ME") gefunden:
http://www.allenware.com/mcsw/errorlevels.zip

Dort findet man auch den Hinweis das interne Befehle von "Command.com" in DOS 7 keinen ERRORLEVEL ändern, sondern nur externe DOS-Befehle:
"The list below details informative ERRORLEVELs returned by the common external commands.
In Windows 95/98/ME, internal commands (namely those coded in COMMAND.COM) do not change the current ERRORLEVEL."

Im Detail werden die ERRORLEVELS beginnend mit "ATTRIB.EXE" bishin zur "XCOPY.EXE" aufgelistet und deren Bedeutung erklärt.

EDIT3:
Nun habe ich mir etwas Hilfe aus dem Usenet (de.comp.os.msdos) geholt und dort wurden mir folgende Seiten empfohlen:
http://support.microsoft.com/kb/81819/en-us
http://www.computing.net/answers/dos/do ... n/773.html

Dirk
Zuletzt geändert von freecrac am Di 17. Mai 2011, 13:14, insgesamt 2-mal geändert.
Merlin
Windows 3.11-Benutzer
Beiträge: 8
Registriert: Mo 19. Feb 2007, 14:21

Re: IF ERRORLEVEL

Beitrag von Merlin »

Hallo Dirk,
vielen Dank für deine ausführliche Antwort...
Hat mir sehr geholfen...
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: IF ERRORLEVEL

Beitrag von freecrac »

Merlin hat geschrieben:Hallo Dirk,
vielen Dank für deine ausführliche Antwort...
Hat mir sehr geholfen...
Danke für dein Feedback. Nun habe ich gelesen das der interne Copy-Befehl gar keinen ERRORLEVEL ungleich Null zurückliefern soll.
Kannst du das bestätigen (ich selber habe das noch gar nicht ausprobiert)?

Auch habe ich gelesen das bei unterschiedlichen DOS-Versionen z.B. beim DIR-Befehl verschiedene ERRORLEVEL zurückgegeben werden,
so das eine Batchdatei wohl besser dafür vorher mit dem VER-Befehl es überprüfen sollte unter welcher DOS-Version die Batchdatei eigentlich ausgeführt wird.
(Auch das habe ich selber noch nicht feststellen können.)

Dirk
Antworten