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