HOWTO · Batch

Fehlerbehandlung im Batch-Skript

In diesem Lernprogramm wird die Fehlerbehandlung in Batch Script behandelt.

Auf dieser Seite

Um Fehler in einer Windows-Datei mit der Endung .bat oder .cmd zu behandeln, prüfen Sie unmittelbar den Exitcode des Befehls und wählen Sie einen Zweig, der das Problem meldet oder bei Erfolg fortfährt. Batch-Befehle geben üblicherweise 0 bei Erfolg und einen Wert ungleich null bei einem Fehler zurück. Ein bestimmter Wert ungleich null kann jedoch auch für einen speziellen Zustand stehen. %ERRORLEVEL% stellt den aktuellen Status bereit, während IF ERRORLEVEL prüft, ob er mindestens einen bestimmten Wert erreicht.

So funktionieren Errorlevels in Batch-Dateien

Nach Abschluss gibt ein Befehl einen Exitcode zurück. Üblicherweise bedeutet 0 Erfolg; ein Wert ungleich null signalisiert, dass der Befehl nicht erfolgreich abgeschlossen wurde. Die genaue Bedeutung hängt jedoch vom jeweiligen Befehl ab. Ein Batch-Skript kann diesen Status nutzen, um den nächsten Schritt festzulegen.

Mit %ERRORLEVEL% lesen Sie den aktuellen Code aus. IF ERRORLEVEL n prüft, ob ein Schwellenwert erreicht ist. Die Bedingung ist wahr, wenn der aktuelle Code größer oder gleich n ist, nicht nur, wenn er genau n entspricht. Prüfen Sie den Status direkt nach dem Befehl, dessen Ergebnis relevant ist, damit kein anderer Befehl ihn überschreibt.

Exitcode eines Befehls prüfen

Wenn Sie mehrere Schwellenwerte prüfen, testen Sie zuerst den größeren Wert. Andernfalls erfüllt ein höherer Code auch jeden niedrigeren Schwellenwert. Für einen direkten Vergleich speichern Sie %ERRORLEVEL% unmittelbar nach dem Befehl und vergleichen anschließend den gespeicherten Wert.

Dieses Beispiel prüft, ob der Text ready in einem Wert vorkommt. Ändern Sie message in ein anderes Wort, um den Fehlerzweig auszulösen. Der gespeicherte Wert stammt direkt von findstr, bevor ein echo-Befehl ihn ersetzen kann. Das Beispiel für die Windows-Eingabeaufforderung wurde im bereitgestellten Paket nicht ausgeführt.

@echo off
set "message=ready"
echo(%message%| findstr /c:"ready" >nul
set "command_status=%ERRORLEVEL%"
if "%command_status%"=="0" (
    echo Match found.
) else (
    echo Match not found.
)

In einem Block in Klammern werden Verweise auf %variable% beim Einlesen des Blocks ausgewertet. Der Status wird vor dem Block gespeichert, sodass der Vergleich das gespeicherte Ergebnis verwendet. Für eine genaue Statusprüfung vergleichen Sie diesen gespeicherten Wert. IF ERRORLEVEL n prüft dagegen, ob der aktuelle Status mindestens n beträgt.

Fehler mit bedingten Befehlen behandeln

Mit && wird der nächste Befehl nur ausgeführt, wenn der vorherige erfolgreich war. Mit || wird der nächste Befehl nur ausgeführt, wenn der vorherige fehlgeschlagen ist. Diese Operatoren eignen sich für kurze Verzweigungen:

some_command && echo Success || echo Failure

Für umfangreichere Fehlerbehandlung ist ein IF-Block leichter zu lesen. IF ERRORLEVEL 1 prüft, ob der Code mindestens 1 beträgt. Damit werden die üblichen Fehlerstatuswerte ungleich null erfasst, ihre jeweilige Bedeutung wird dadurch aber nicht unterschieden. Für eine genaue Statusprüfung speichern Sie %ERRORLEVEL% unmittelbar und vergleichen den gespeicherten Wert wie oben gezeigt.

Beispiel für einen Fehler- und Erfolgsfall erstellen und prüfen

Dieses Skript erstellt mit einem zufälligen Namen ein neues Demonstrationsverzeichnis im temporären Windows-Verzeichnis. Es löscht niemals einen Pfad. Wenn das Erstellen des Verzeichnisses fehlschlägt oder die erwartete Eingabedatei bereits vorhanden ist, wird das Skript mit dem Einrichtungsstatus 2 beendet. Vor dem Aufruf von type prüft es, ob die Eingabedatei fehlt. Die erwartete Fehlermeldung wird nur ausgegeben, wenn die Datei weiterhin nicht vorhanden ist. Anschließend erstellt das Skript die Eingabedatei, prüft, ob das Schreiben erfolgreich war, und liest dieselbe Datei aus. Das Beispiel für die Windows-Eingabeaufforderung wurde im bereitgestellten Paket nicht ausgeführt.

Führen Sie das Beispiel aus:

@echo off
set "demo_dir=%TEMP%\batch-error-demo-%RANDOM%-%RANDOM%"
set "demo_file=%demo_dir%\input.txt"
if exist "%demo_dir%" (
    echo Setup failed: the randomized demo directory is already present.
    exit /b 2
)
mkdir "%demo_dir%" >nul 2>&1
if errorlevel 1 (
    echo Setup failed: could not create the fresh demo directory.
    exit /b 2
)
if exist "%demo_file%" (
    echo Setup failed: the demo input is already present.
    exit /b 2
)

type "%demo_file%" >nul 2>&1
set "command_status=%ERRORLEVEL%"
if not "%command_status%"=="0" (
    if not exist "%demo_file%" (
        echo Failure: input.txt was not found.
    ) else (
        echo Failure: input.txt could not be read.
        exit /b 1
    )
) else (
    echo Read input.txt successfully.
)

>"%demo_file%" echo ready
if errorlevel 1 (
    echo Setup failed: could not create input.txt.
    exit /b 2
)
type "%demo_file%" >nul 2>&1
if errorlevel 1 (
    echo Failure: input.txt could not be read.
    exit /b 1
)
echo Success: input.txt contains ready.
exit /b 0

Die erste Prüfung veranschaulicht den erwarteten Fehler bei einer fehlenden Datei; das spätere Auslesen zeigt den Erfolgsfall. Nach erfolgreichem Auslesen gibt das Skript 0 zurück, bei einem Lesefehler 1 und mit 2, wenn kein neues Demonstrationsverzeichnis oder keine Eingabedatei eingerichtet werden kann. Das eindeutig benannte Verzeichnis bleibt in %TEMP% erhalten, damit keine anderen Daten entfernt werden. Wenn Sie es aufräumen möchten, prüfen Sie es zuerst und löschen Sie anschließend genau dieses Verzeichnis manuell.

Fehler protokollieren und einen hilfreichen Status zurückgeben

Ein hilfreicher Fehlerbehandler benennt den fehlgeschlagenen Vorgang, bewahrt bei Bedarf Diagnoseausgaben auf und gibt einen Status ungleich null an den aufrufenden Prozess zurück. Hängen Sie mit >> "%LOGFILE%" 2>&1 sowohl die Standardausgabe als auch die Standardfehlerausgabe an eine Protokolldatei an. Prüfen Sie anschließend sofort den Status des Befehls. Die Umleitung speichert Ausgaben, behandelt den Fehler aber nicht selbst.

Nachdem Sie einen geeigneten Protokollpfad festgelegt haben, kann ein Skript beispielsweise einen Befehl mit >> "%LOGFILE%" 2>&1 ausführen, in der nächsten Zeile %ERRORLEVEL% speichern und anhand dieses Werts verzweigen. Bei einem Fehler geben Sie eine Meldung aus, die den Vorgang und die Protokolldatei nennt, und verwenden dann exit /b 1. Bei Erfolg verwenden Sie exit /b 0. Wählen Sie einen Protokollpfad, in den der Skriptbenutzer schreiben darf, und gehen Sie nicht davon aus, dass jeder Wert ungleich null dieselbe Ursache hat.