BATCH: Richtige ERRORLEVEL-Auswertung

ich habe heute ein Problem mit einem Tool (NcFtpPut.exe) gehabt, bei dem in einer Batch der ERRORLEVEL ausgewertet wird.
Ich habe lange sucht um herauszufinden, warum die ERRORLEVEL-Auswertung fehlerhaft ist.
Nach einiger Suche, muss ich zur meiner Schande gestehen, habe ich herausgefunden, dass ich den ERRORLEVEL seit jeher falsch verwendet habe!! ?
Hier die Erklärung – wichtig ist hier vor allem, dass der Befehl „IF NOT ERRORLEVEL 0…“ totaler Schwachsinn ist.

VIELEN DANK FÜR DIE TOLLE ERKLÄRUNG AN HORST SCHÄFFLER!!

Quelle: http://www.antonis.de/dos/batchtut/bat-kurs/#10

=========== IF ERRORLEVEL n ======================== Lektion #10 ===


Jedes Programm gibt einen Return-Code ("Beendigungscode") an das aufrufende Programm zurück, normalerweise also an COMMAND.COM. Dieser Return-Code ist ein Byte und kann daher die Werte 0...255 haben.

Um diesen Return-Code zu interpretieren, muß man natürlich wissen, welche Werte für welchen Fall von dem betreffenden Programm vorgesehen sind. In den meisten Fällen wird der Code benutzt, um mitzuteilen, ob ein Fehler aufgetreten ist: Null bedeutet "Programm ordnungsgemäß beendet", jeder andere Wert signalisiert einen Fehler. Wenn es "leichte" und "schwere" Fehler gibt, kann das Programm verschiedene Codes verwenden: je höher um so schwerwiegender der Fehler.

Auf dieser Basis wurde die IF ERRORLEVEL... Abfrage im Batch konzipiert:
IF ERRORLEVEL n
bedeutet: IF Return-Code >= n (größer oder gleich n)

So kann mit einer einzigen Abfrage (IF ERRORLEVEL 1) festgestellt werden, ob überhaupt ein Fehler aufgetreten ist, ohne daß alle anderen (möglicherweise gelieferten) Codes abgefragt werden müssen.

Bei allen ERRORLEVEL-Abfragen muß man sich also der "größer/gleich" Logik bewußt sein. Wenn auf verschiedene Return-Codes reagiert werden soll, ist eine Abfrage in absteigender Folge erforderlich.

Beispiel: Ein Programm kann die Return-Codes 0,1,3 und 9 zurückgeben. Dann lautet die Abfrage:
IF errorlevel 9 goto Label-9
IF errorlevel 3 goto Label-3
IF errorlevel 1 goto Label-1
:: hier bleibt nur noch errorlevel 0

Übrigens:
Die Abfrage "IF [not] ERRORLEVEL 0 ... " ist absolut witzlos, denn größer oder gleich Null ist der Return-Code IMMER.
Um nur den Return-Code 0 abzufragen verwendet man logischerweise:
IF NOT errorlevel 1 goto ...

Soll nur ein ganz bestimmter Code abgefangen werden, z.B. 100, dann geht das so:
IF errorlevel 100  IF NOT errorlevel 101 goto ....


Noch ein Hinweis:

Der Return-Code kann nur in dieser IF ERRORLEVEL Konstruktion angesprochen werden. Eine *direkte* Verwendung des Wertes (z.B. als Variable) ist nicht so ohne weiteres möglich.

Andere Verwendung des Return-Codes :

Ein Programm kann natürlich den Return-Code auch für andere Zwecke als nur für Fehler verwenden. Z.B. kann ein Mailer mit bestimmten Codes mitteilen, was gerade anliegt. Auf jeden Fall muß vereinbart sein, welche Codes für welchen Zweck verwendet werden. Dafür gibt es keinerlei allgemeine Regeln.

DOS-Befehle :

DOS-Befehle, also in COMMAND.COM integrierte Befehle ohne eigene Programmdatei, geben überhaupt keinen Return-Code zurück, auch nicht Null. Der zuvor produzierte Return-Code bleibt erhalten!

Das hat den Vorteil, daß Befehle wie ECHO den letzten Return-Code nicht verändern, aber leider auch den Nachteil, daß man auf diese Weise nicht feststellen kann, ob z.B. ein COPY oder DEL erfolgreich war.

Sonstige DOS-Dienstprogramme :

Der FIND-Befehl gibt den erwarteten Errorlevel zurück: 0=gefunden,1=nicht gefunden - allerdings erst seit MS-DOS Version 6.xx. Wer ähnliches z.B. von FC (Dateivergleich) erwartet, sieht sich leider getäuscht.

Grundsätzlich sollte man sich also genau informieren, welche Returncodes geliefert werden, wenn Errorlevel-Abfragen benutzt werden. Entsprechende Informationen sind teils in alten DOS-Handbüchern,teils auch in der HELP-Funktion (ab MS-DOS 6.xx), meist aber gar nicht zu finden. Notfalls also selbst testen.
“Das einzig sichere System müsste ausgeschaltet, in einem versiegelten und von Stahlbeton ummantelten Raum und von bewaffneten Schutztruppen umstellt sein.”
Gene Spafford (Sicherheitsexperte)