HOWTO · Batch

Erstellen eine Funktion im Batch-Skript

In diesem Tutorial wird erläutert, wie Sie eine Funktion in Batch Script erstellen.

Auf dieser Seite

Batch-Dateien definieren Funktionen nicht mit einem eigenen Deklarationsschlüsselwort. Ein wiederverwendbares Unterprogramm ist eine Sprungmarke, die mit CALL aufgerufen wird; CALL führt die Befehle nach dieser Marke aus und kehrt anschließend zum nächsten Befehl nach dem Aufruf zurück. Diese Beispiele verwenden die Syntax von Windows CMD und sollten unter Windows in einer .bat- oder .cmd-Datei ausgeführt werden.

So funktionieren Batch-Funktionen

Eine Batch-„Funktion“ wird üblicherweise Unterprogramm genannt. Ihre Sprungmarke bezeichnet den Einstiegspunkt. CALL :label überträgt die Ausführung dorthin und merkt sich die Rücksprungstelle. Eine Sprungmarke allein erzeugt keinen eigenen Gültigkeitsbereich und kehrt nicht automatisch zurück. Verwenden Sie innerhalb des Unterprogramms EXIT /B, um zum Aufrufer zurückzukehren. Ohne eine ausdrückliche Rückkehr kann die Ausführung mit nachfolgenden Marken und Befehlen fortfahren. EXIT /B beendet das aktuelle Batch-Skript, wenn es nicht als Unterprogramm aufgerufen wurde.

Eine Batch-Funktion definieren und aufrufen

Platzieren Sie den Aufruf vor der Sprungmarke und beenden Sie anschließend den Hauptteil mit GOTO :EOF, damit die Ausführung nicht versehentlich in das Unterprogramm weiterläuft. Im erzeugten Skript gibt das Unterprogramm eine Begrüßung aus und kehrt zum Aufrufer zurück.

Um ein kleines Skript für Windows CMD anzusehen, ohne zu behaupten, CMD sei hier ausgeführt worden, starten Sie dieses Python-Skript. Es gibt den Batch-Quelltext aus. Speichern Sie die Ausgabe als .bat- oder .cmd-Datei und führen Sie sie in Windows CMD aus.

Der unveränderte Code und die darin angezeigten Bezeichnungen und Ausgaben bleiben auf Englisch.

print('''@echo off
call :greet "Ada"
echo Back in the main script.
goto :eof

:greet
echo Hello, %~1!
exit /b 0''')
@echo off
call :greet "Ada"
echo Back in the main script.
goto :eof

:greet
echo Hello, %~1!
exit /b 0

Das erzeugte Skript ist für Windows CMD vorgesehen; Python gibt den Quelltext aus, führt ihn aber nicht aus. GOTO :EOF beendet den Hauptablauf, und EXIT /B 0 gibt von der aufgerufenen Sprungmarke einen Erfolgsstatus zurück. 0 ist der übliche Erfolgscode; ein Wert ungleich null kann dem Aufrufer einen Fehler melden.

Argumente an eine Batch-Funktion übergeben

Die Argumente folgen in einem CALL-Befehl nach der Sprungmarke und werden durch Leerzeichen getrennt. Innerhalb des Unterprogramms steht %1 für das erste Argument, %2 für das zweite und so weiter. Verwenden Sie vorzugsweise %~1, wenn Sie das erste Argument ohne möglicherweise vorhandene umgebende Anführungszeichen benötigen. Die Tilde macht den Wert nicht automatisch sicher für jeden Befehl. Setzen Sie Werte daher in Anführungszeichen, wenn Sie sie als Pfade oder Text verwenden.

Dieses Python-Beispiel gibt ein vollständiges Batch-Skript aus, das ein Argument mit einem Leerzeichen übergibt. Speichern Sie den ausgegebenen Quelltext als .bat- oder .cmd-Datei, um ihn in Windows CMD auszuführen. Das Unterprogramm :show liest den Wert als %~1 aus.

Der unveränderte Code und die darin angezeigten Bezeichnungen und Ausgaben bleiben auf Englisch.

print("""@echo off
call :show "Ada Lovelace"
goto :eof

:show
echo Name: %~1
exit /b 0""")
@echo off
call :show "Ada Lovelace"
goto :eof

:show
echo Name: %~1
exit /b 0

Belassen Sie die Argumenterweiterung in Vergleichen mit Anführungszeichen oder in SET-Zuweisungen mit Anführungszeichen, wenn der Wert Leerzeichen oder Befehlsmetazeichen enthalten kann. Batch wird in mehreren Phasen ausgewertet, deshalb erfordern komplexe Werte wie %, & und | besondere Sorgfalt.

Rückgabewerte und Exitcodes

Batch verfügt über keinen eingebauten Rückgabewert für Funktionen. Ein gängiges Muster ist, ein Ergebnis in einer Umgebungsvariablen abzulegen und den Exitcode des Unterprogramms getrennt für Erfolg oder Fehler zu verwenden. Dieses Python-Beispiel gibt ein vollständiges Batch-Skript aus, das ein Unterprogramm mit zwei Argumenten aufruft, seinen Status unmittelbar nach CALL prüft und bei Erfolg die Ergebnisvariable ausliest. Speichern Sie den ausgegebenen Quelltext als .bat- oder .cmd-Datei, um ihn in Windows CMD auszuführen.

Der unveränderte Code und die darin angezeigten Bezeichnungen und Ausgaben bleiben auf Englisch.

print("""@echo off
setlocal EnableExtensions
call :add 5 10
if errorlevel 1 goto add_failed
echo Sum: %sum%
goto :eof

:add_failed
echo Addition failed.
goto :eof

:add
if "%~1"=="" exit /b 1
if "%~2"=="" exit /b 1
setlocal
set /a "_sum=%~1 + %~2"
endlocal & set "sum=%_sum%"
exit /b 0""")
@echo off
setlocal EnableExtensions
call :add 5 10
if errorlevel 1 goto add_failed
echo Sum: %sum%
goto :eof

:add_failed
echo Addition failed.
goto :eof

:add
if "%~1"=="" exit /b 1
if "%~2"=="" exit /b 1
setlocal
set /a "_sum=%~1 + %~2"
endlocal & set "sum=%_sum%"
exit /b 0

Die Sprungmarke liest die Positionswerte als %~1 und %~2 aus. SETLOCAL hält die temporäre Variable _sum lokal. In derselben Befehlszeile erweitert CMD %_sum%, bevor ENDLOCAL ausgeführt wird, und weist diesen Wert anschließend der Variable sum des Aufrufers zu. Lassen Sie ENDLOCAL & SET zusammen. Dieses Beispiel erwartet Ganzzahlargumente. Fehlende Argumente führen zum Status 1; eine abgeschlossene Addition liefert Status 0.

Fehler in einer Batch-Funktion behandeln

Prüfen Sie erforderliche Eingaben möglichst am Anfang des Unterprogramms und geben Sie einen Status ungleich null zurück, wenn sie fehlen. Dieses Python-Beispiel gibt ein vollständiges Batch-Skript aus, das dieselbe Prüfmarke einmal mit fehlender und einmal mit vorhandener Eingabe aufruft. Auf jeden Aufruf mit CALL folgt unmittelbar die Prüfung mit if errorlevel 1. Speichern Sie den ausgegebenen Quelltext als .bat- oder .cmd-Datei, um ihn in Windows CMD auszuführen.

Der unveränderte Code und die darin angezeigten Bezeichnungen und Ausgaben bleiben auf Englisch.

print("""@echo off
call :require_value
if errorlevel 1 (
    echo Missing input: rejected with status 1.
) else (
    echo Missing input: accepted.
)

call :require_value "report.txt"
if errorlevel 1 (
    echo Valid input: rejected.
) else (
    echo Valid input: accepted with status 0.
)
goto :eof

:require_value
if "%~1"=="" exit /b 1
exit /b 0""")
@echo off
call :require_value
if errorlevel 1 (
    echo Missing input: rejected with status 1.
) else (
    echo Missing input: accepted.
)

call :require_value "report.txt"
if errorlevel 1 (
    echo Valid input: rejected.
) else (
    echo Valid input: accepted with status 0.
)
goto :eof

:require_value
if "%~1"=="" exit /b 1
exit /b 0

Beim ersten Aufruf wird der Fehlerzweig erreicht, weil der erforderliche Wert fehlt; beim zweiten wird der Erfolgszweig erreicht. if errorlevel 1 bedeutet, dass der aktuelle Fehlerlevel mindestens 1 beträgt. Wenn es auf den genauen Code ankommt, prüfen Sie höhere Codes in absteigender Reihenfolge. Mit einem gültigen Argument kann das Unterprogramm seine Arbeit ausführen und mit EXIT /B 0 enden.

Verwenden Sie für die Rückkehr aus einem Unterprogramm EXIT /B statt EXIT: EXIT schließt die CMD-Sitzung, während EXIT /B aus dem aktuellen Batch-Kontext zurückkehrt. Wenn ein CALL auf eine nicht vorhandene Sprungmarke verweist, meldet CMD einen Fehler. Einheitliche Schreibweisen der Marken und sichtbar zusammengehörige Aufrufe und Marken erleichtern die Fehlersuche. Die Python-Beispiele geben Batch-Quelltext aus, führen ihn aber nicht aus. Führen Sie die gespeicherten Skripte in Windows CMD aus, um ihr Batch-Verhalten zu beobachten.