HOWTO · Batch
IF ELSE-Bedingung im Batch-Skript
In diesem Tutorial wird die Struktur der IF ELSE-Bedingung in einem Batch-Skript erläutert.
Auf dieser Seite
Mit IF ... ELSE führen Sie in einer Batchdatei für Windows CMD eine Befehlsgruppe aus, wenn eine Bedingung wahr ist, und eine andere, wenn sie falsch ist. Setzen Sie jede Gruppe in Klammern und platzieren Sie ELSE in derselben logischen Befehlszeile wie die schließende Klammer des wahren Zweigs. Die folgenden Beispiele sind Batchdatei-Beispiele. Ihre Ausgabe hängt von den gezeigten Eingaben und der Umgebung ab.
Syntax von IF … ELSE und ein einfaches Beispiel
Die allgemeine Form lautet IF condition ( commands-for-true ) ELSE ( commands-for-false ). Die Bedingung kann einen Vergleich oder ein Dateiattribut prüfen. Wenn im falschen Fall nichts geschehen soll, kann eine Batchdatei ELSE weglassen.
Führen Sie dieses Beispiel in einer .bat-Datei aus. Es legt zwei Werte fest, vergleicht sie und gibt anschließend aus, welcher Zweig ausgewählt wird. Da 10 kleiner als 20 ist, wird der wahre Zweig ausgewählt. Die erwartete Ausgabe lautet:
@echo off
set /a left=10
set /a right=20
if %left% LSS %right% (
echo %left% is less than %right%.
) else (
echo %left% is not less than %right%.
)
10 is less than 20.
Für eine Dateiüberprüfung verwenden Sie IF EXIST path. Der wahre Zweig wird ausgewählt, wenn die angegebene Datei oder das Verzeichnis zum Prüfzeitpunkt vorhanden ist. Die folgende eigenständige Batchdatei erstellt eine temporäre Datei, prüft sie und löscht sie anschließend:
@echo off
set "sample=%TEMP%\if-else-sample-%RANDOM%.txt"
echo sample>"%sample%"
if exist "%sample%" (
echo File exists.
) else (
echo File does not exist.
)
del "%sample%"
File exists.
Ändern Sie den Pfad, um eine andere Datei zu prüfen. Wenn Sie nur den Fall einer fehlenden Datei behandeln müssen, führt IF NOT EXIST path ( commands ) die Befehle aus, wenn der Pfad nicht vorhanden ist.
Vergleichsoperatoren in Batch
Für numerische Bedingungen unterstützt CMD EQU (gleich), NEQ (ungleich), LSS (kleiner als), LEQ (kleiner oder gleich), GTR (größer als) und GEQ (größer oder gleich). Dies sind numerische Vergleiche; für Zeichenfolgen verwenden Sie ==. Setzen Sie Zeichenfolgen in Anführungszeichen, damit Leerzeichen oder ein leerer Wert die Bedingung nicht beeinträchtigen, zum Beispiel: IF "%mode%"=="backup" ( echo Backup mode ).
NOT kehrt eine Bedingung um, etwa bei IF NOT EXIST "report.txt" ( echo Create the report first ). AND und OR sind in der IF-Bedingungssyntax von CMD keine direkten logischen Operatoren. Wenn mehrere Prüfungen erforderlich sind, verschachteln Sie IF-Anweisungen. Um nach einem erfolgreichen Befehl einen weiteren auszuführen, können Sie die separate Befehlsverkettung mit && verwenden; sie funktioniert anders als das Kombinieren von Bedingungen.
Verschachtelte IF … ELSE-Bedingungen
Platzieren Sie ein weiteres IF ... ELSE innerhalb eines Zweigs, wenn die nächste Entscheidung von der ersten abhängt. Dieses vollständige Beispiel prüft zuerst den höheren Notengrenzwert und danach den nächstniedrigeren:
@echo off
set /a score=85
if %score% GEQ 90 (
echo Grade: A
) else (
if %score% GEQ 80 (
echo Grade: B
) else (
echo Grade: C
)
)
Die erste Bedingung ist für 85 falsch, daher wertet CMD die verschachtelte Bedingung aus. Da 85 mindestens 80 beträgt, gibt dieser Zweig die Note B aus. Die Reihenfolge ist wichtig: Würde zuerst der niedrigere Grenzwert geprüft, träfe er auch auf höhere Punktzahlen zu.
Praktische IF … ELSE-Beispiele
Eine Dateiüberprüfung ist nützlich, bevor Sie einen Pfad lesen, kopieren oder löschen. IF EXIST "%~1" ( ... ) ELSE ( ... ) prüft beispielsweise das erste Argument, das an eine Batchdatei übergeben wurde. %~1 entfernt die umgebenden Anführungszeichen dieses Arguments; wenn Sie den Wert in der Bedingung erneut in Anführungszeichen setzen, werden auch Pfade mit Leerzeichen berücksichtigt.
Ein Skript kann außerdem einen administrativen Vorgang versuchen und dessen Ergebnis prüfen. Eine einzelne Berechtigungsprüfung ist jedoch nicht allgemeingültig zuverlässig: Der Befehl kann auch wegen der Dienstkonfiguration oder einer Richtlinie fehlschlagen. In einer Batchdatei für Windows CMD folgt auf net session >nul 2>&1 unmittelbar das Muster IF ERRORLEVEL 1 ( echo The command did not succeed; check permissions and system configuration. ) ELSE ( echo The command succeeded. ). Dieser plattformspezifische Befehl hängt von Windows-Diensten und Kontorichtlinien ab. Daher wird hier weder eine konkrete Laufzeitausgabe behauptet noch garantiert, dass damit administrative Rechte festgestellt werden.
IF ERRORLEVEL n prüft, ob der vorherige Befehl einen Exitcode größer oder gleich n zurückgegeben hat. Die Prüfung muss direkt auf den Befehl folgen, dessen Status Sie untersuchen möchten. Gehen Sie nicht davon aus, dass jeder Fehler auf fehlende administrative Rechte zurückzuführen ist.
Häufige Fehler und der Geltungsbereich von Windows CMD
Diese Beispiele verwenden die Batch-Syntax von Windows CMD, nicht die Syntax von PowerShell oder Bash. Lassen Sie ELSE direkt auf die schließende Klammer der wahren Befehlsgruppe folgen. Ein eingefügter Befehlsseparator oder ein ELSE in einer eigenen Befehlszeile kann verhindern, dass CMD die Zweige einander zuordnet.
CMD expandiert %variable%, wenn es einen Klammerblock einliest. Ändert sich eine Variable innerhalb dieses Blocks, kann ein späterer Verweis auf %variable% im selben Block weiterhin ihren vorherigen Wert enthalten. Wenn ein Skript innerhalb eines Blocks den aktualisierten Wert benötigt, aktivieren Sie die verzögerte Expansion mit setlocal EnableDelayedExpansion und verwenden Sie !variable!. Beachten Sie, dass ! bei aktiver verzögerter Expansion auch in Pfaden oder Texten eine besondere Bedeutung haben kann.
Verwenden Sie AND oder OR nicht so, als würden diese beiden IF-Vergleiche kombinieren. Verschachteln Sie Bedingungen für voneinander abhängige Prüfungen und achten Sie darauf, dass jedes ELSE zum beabsichtigten IF gehört. Setzen Sie bei Zeichenfolgenvergleichen beide Seiten in Anführungszeichen, etwa bei IF "%first%"=="%second%", damit Leerzeichen oder ein fehlender Wert die Auswertung durch CMD nicht verändern.