CMD ERRORLEVEL

,

dircdtreedelattribifVariablenERRORLEVELxcopyrobocopy

Die Variable ERRORLEVEL

Jeder Programmierer kann beim Beenden seines Programms einen 8-Bit-Return-Code hinterlassen, deutsch „Beendigungscode“. Das Betriebssystem speichert diesen Code in einer Variable ERRORLEVEL, die von nachfolgenden Programmen ausgewertet werden kann. ERRORLEVEL = 0 bedeutet, dass bei der Befehlsausführung keine Fehler aufgetreten sind, jeder Wert ungleich Null signalisiert einen Fehler. Je höher der Wert, desto schwerer der Fehler. Welcher Befehl welche Fehlercodes melden kann, müssen Sie in Listen nachschlagen.
Auch eine Stapeldatei kann einen Return-Code hinterlassen: mit dem Befehl  exit /b Returncode, wobei Returncode zwischen 0 und 255 liegen muss.

Folgende Befehle setzen ERRORLEVEL = 1, wenn ein Fehler aufgetreten ist: CD, CHDIR, COLOR, COPY, DATE, DEL, DIR, ERASE, MD, MKDIR, MOVE, RENAME, TIME, TYPE, VOL.

Folgende Befehle nutzen den ERRORLEVEL nicht und sie verändern den von einem früher ausgeführten Befehl hinterlassenen ERRORLEVEL auch nicht. Zu diesen Befehlen gehören BREAK, COPY, DEL, ECHO, ENDLOCAL, FC, FOR, IF, PAUSE, RD, REM, RMDIR, TITLE.

Mit dem Befehl „IF“ kann die Variable ausgewertet werden. Ein Beispiel:
Der Befehl CD meldet ERRORLEVEL = 0, wenn zum gewünschten Ordner gewechselt werden konnte, sonst =1. Eine Befehlsfolge als Beispiel:
cd \users\klaus
if errorlevel 1 echo Den Ordner \users\klaus gibt es nicht!
if errorlevel 1 goto Abbruch

Falls es den Ordner \users\klaus nicht gibt, wird mit dem Echo-Befehl eine Fehlermeldung auf den Bildschirm ausgegeben und anschließend ein Sprungbefehl zur Sprungmarke „Abbruch“ ausgeführt.

Mit dem Befehl
echo Errorlevel ist %ERRORLEVEL%
kann man den Wert von ERRORLEVEL abfragen.
Setzen Sie ERRORLEVEL nicht selbst! set ERRORLEVEL=1 ist nicht ratsam.

Wie funktioniert die Abfrage mit IF?
IF ERRORLEVEL n
bedeutet: IF Return-Code >= n (größer oder gleich n)
Daraus folgt: Mit der Abfrage IF ERRORLEVEL 1 kann festgestellt werden, ob überhaupt ein Fehler aufgetreten ist, ohne daß alle anderen (möglicherweise gelieferten) Codes abgefragt werden müssen.
Daraus folgt auch: die Abfrage IF ERRORLEVEL 0 ist sinnlos, denn alle Fehlercodes sind >0 oder =0.

Verknüpfungen von Anweisungen

A und B seien zwei Anweisungen.

CodeBedeutungBeispiel
A | BFühre erst A aus, dann B. Standardausgabe von A wird zur Eingabe von B.dir c: | more
A & BFühre erst A aus, dann B
A && BFühre A aus. Wenn kein Fehler, führe B aus.copy text1.txt text2.txt && echo Kopieren erfolgreich!
A || BFühre A aus. Nur wenn Fehler, führe B aus.rd c:\temp || echo Ordner c:\temp kann nicht gelöscht werden

Tabelle 1: Kommandos die ERRORLEVEL nicht verändern

KommandoAnmerkungen
BREAK
ECHO
ENDLOCAL
FORSiehe “Exit Code”
IFSiehe “Exit Code”
PAUSE
RD, RMDIRBei einem Fehler wird nicht ERRORLEVEL geändert, sondern der “Exit Code”.
REM
SETSET ohne Parameter lässt ERRORLEVEL unverändert. SET mit Parametern: Siehe Tabelle 3.
TITLE

Tabelle 2: Kommandos die ERRORLEVEL =0 oder =1 setzen, abhängig vom Resultat

KommandoSet ERRORLEVEL = 0 wennSet ERRORLEVEL = 1 wenn
CD, CHDIROrdner wurde gewechseltOrdner gibt es nicht oder Zugriff unmöglich
COLORFarbe wurde geändertVordergrund- und Hintergrundfarbe sind identisch
COPYDateien wurden kopiertDatei nicht gefunden oder falsche Parameter angegeben
DATEDatum wurde geändert oder kein Datum angegebenBenutzer hat keine Admin-Rechte
DELimmer = 0 außer:Parameter fehlen oder sind fehlerhaft
DIRwie COPY
ERASEwie DEL
MD, MKDIROrdner wurde angelegtOrdner wurde nicht angelegt
MOVEDatei wurde umbenannt bzw. verschobenDatei nicht gefunden, konnte nicht umbenannt bzw. verschoben werden oder falsche Parameter
PUSHDwie CDOrdner gibt es nicht oder Zugriff unmöglich oder falscher Parameter
REN, RENAMEwie MOVEfalsche Parameter angegeben
SETLOCALNeue Umgebung wurde erzeugtOrdner gibt es nicht oder Zugriff unmöglich oder falscher Parameter
TIMEZeit wurde geändert oder keine Zeit angegebenBenutzer hat keine Admin-Rechte
TYPEwie COPY
VERIFYOK oder keine Parameter angegebenfalsche Parameter
VOLDas Volume-Label wurde angezeigtLaufwerk nicht gefunden oder falsche Parameter angegeben

Tabelle 3: Kommandos die ERRORLEVEL bei einem Fehler setzen, andernfalls den ERRORLEVEL nicht verändern

Kommando E  Set ERRORLEVEL auf = wenn
ASSOC * Extension associations could not be changed.
CLSBad switch given.
DPATH*1 = Data path could not be established.
FTYPE*1 = File type associations could not be changed.
GOTO Label1 = Label not exist *in a subroutine* (equivalent to: EXIT /B 1).
KEYS1 = Bad switch given.
PATH*1 = Path could not be changed.
POPD1 = Bad switch given.
PROMPT*1 = Prompt could not be changed.
SET var*1 = No variable with such name exists.
SET var=value*1 = Variable name start with “/” not enclosed in quotes.
SET /P*1 = Read an empty line or at end of file.
SET /A*1073750988 = Unbalanced parentheses, 1073750989 = Missing operand, 1073750990 = Syntax error, 1073750991 = Invalid number, 1073750992 = Number larger than 32-bits, 1073750993 = Division by zero.
SHIFT1 = Bad switch given.

Ein Stern in Spalte „E“ der Tabelle 3 zeigt diejenigen Befehle an, die ihr Verhalten entsprechend dem Status „Erweiterungen“ ändern. Wenn Erweiterungen aktiviert sind (was die Standardeinstellung ist) und diese Befehle in einer Datei mit der Erweiterung .CMD anstelle von .BAT gespeichert werden, setzen diese Befehle ERRORLEVEL = 0, wenn sie ohne Fehler enden, d. h. wenn die in Tabelle 3 beschriebenen Bedingungen nicht erfüllt sind.

Tabelle 4 – Spezialfälle

KommandoSet ERRORLEVEL
CALL Table1Wird einer der Befehle aus Table 1 (außer FOR und IF) aufgerufen: set ERRORLEVEL = 0.
CALL subroutineWird die Subroutine aufgerufen, bleibt der ERRORLEVEL unverändert; andernfalls (Subroutine existiert nicht): set ERRORLEVEL = 1.
EXIT /B, EXITDer vorhandene ERRORLEVEL bleibt unverändert.
EXIT /B Nummer Setzt ERRORLEVEL gleich der angegebenen Nummer.
EXIT NummerSetzt ERRORLEVEL gleich der angegebenen Nummer.
START commandWenn command startet, bleibt ERRORLEVEL unverändert; andernfalls set ERRORLEVEL = 9059.
START /WAIT batWenn die gestartete Batch endet, set ERRORLEVEL = value vom ‘EXIT number’ commmand.
notExistBeim Versuch, ein nicht-existierendes Kommando auszuführen, set ERRORLEVEL = 9009.
VERSet ERRORLEVEL = 0. Jedoch die Abfrage VER /? verändert ERRORLEVEL nicht.

Exit Code

Einige Programme hinterlassen einen Exit Code, aber keinen ERRORLEVEL.

Es gibt zwei Möglichkeiten, den ERRORLEVEL-Wert zu testen: über den Befehl IF ERRORLEVEL / IF %ERRORLEVEL% oder mit dem Befehl && thenCmd, wenn ERRORLEVEL 0 ist || elseCmd wenn ERRORLEVEL nicht 0 ist. Bestimmte Befehle und Umleitungsfehler geben jedoch einen Wert zurück, der nur im zweiten Fall funktioniert und sich nicht im ERRORLEVEL widerspiegelt; wir können diesen Wert „Exit Code“ nennen. Wenn dieser Exit-Code nicht null ist, kann er an das ERRORLEVEL weitergegeben werden, das irgendeinen Befehl von Tabelle 1 in dem elseCmd-Teil ausführt. Weitere Einzelheiten zu diesem Thema können Sie im folgenden nachlesen.

Tabelle 5 – Befehle oder Merkmale die den Exit-Code setzen

Feature      │ Set Exit Code to = when
─────────────┼─────────────────────────────────────────────────────────────────────────
command      │1 = Command not exist (when ERRORLEVEL = 9009).
redirection  │1 = File not exists in "<", path not exists or access denied in ">" ">>".
drive:       |1 = Drive unit not exists.
POPD         |1 = No matching PUSHD was previously executed.
RD           │1 = Bad switch given, 2 = Directory not found, 5 = Access denied,
             │32 = Directory in use, 145 = Directory not empty.
FOR /F       │1 = No data was processed.

Beispiel: Testen, ob eine Weiterleitung funktioniert hat

command > C:\Path\that\does\not\exist\file.txt || rem
if errorlevel 1 echo Previous redirection failed

In diesem Beispiel wird das rem Kommando benutzt, um den Exit-Code von RD in die Variable ERRORLEVEL zu kopieren.
Anstelle von rem sind auch andere interne Kommandos geeignet, welche den ERRORLEVEL nicht verändern (außer FOR und IF)

Beispiel: Testen, ob es ein Laufwerk gibt

U: || rem
if errorlevel 1 echo Der Wechsel zu Laufwerk U: ist fehlgeschlagen

In diesem Beispiel wird das rem Kommando benutzt, um den Exit-Code des Laufwerkwechsels in die Variable ERRORLEVEL zu kopieren.
Anstelle von rem sind auch andere interne Kommandos geeignet, welche den ERRORLEVEL nicht verändern (außer FOR und IF)

Beispiel: Auswertung des Befehls rd

Der Befehl rd kann die folgenden Exit-Codes zurückmelden:
1 = Bad switch given, 2 = Directory not found, 5 = Access denied, 32 = Directory in use, 145 = Directory not empty.

rd c:\Some\directory 2> NUL || rem
if %errorlevel% equ 0 (
echo Directory deleted
) else if %errorlevel% equ 2 (
echo Directory not found
) else if %errorlevel% equ 5 (
echo Can not access the directory, check rights
) else if %errorlevel% equ 32 (
echo Can not delete current directory
) else if %errorlevel% equ 145 (
echo Directory is not empty, use /S switch

)

 


 

Skills

Posted on

5. April 2022

Submit a Comment

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

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahren Sie mehr darüber, wie Ihre Kommentardaten verarbeitet werden .

Skills

Posted on

5. April 2022

WordPress Cookie-Hinweis von Real Cookie Banner