Die Befehle DO (wenn sie mit dem Schlüsselwort UNTIL oder WHILE verwendet werden), IF, IFF/ELSEIFF und die Variablenfunktion @IF werten einen bedingten Ausdruck aus und führen eine andere Aktion aus, je nachdem, ob der Ausdruck WAHR ist oder nicht . Der Befehl SWITCH prüft Wertepaare auf Gleichheit. Die meisten der folgenden Beispiele verwenden den IF-Befehl, aber bedingte Ausdrücke können auch in den anderen oben genannten Fällen verwendet werden.
Ein bedingter Ausdruck kann einer der folgenden sein, wie unten beschrieben:
Ein relationaler Ausdruck vergleicht zwei Zeichenketten unter Verwendung eines der in der folgenden Tabelle aufgeführtenrelationalen Operatoren. Jede dieser beiden Zeichenketten kann literalen Text, Umgebungs- und interne Variablen sowie Variablenfunktionen, einschließlich benutzerdefinierter Funktionen, in beliebiger Kombination enthalten. Beachten Sie, dass doppelte Anführungszeichen von Bedeutung sind.
Vergleich von Zahlen und Zeichenketten
Beim Vergleich der beiden Zeichenketten wird entweder ein numerischer oder ein String-Vergleich verwendet. Ein numerischer Vergleich behandelt die Zeichenketten als numerische Werte und prüft sie arithmetisch. Bei einem String-Vergleich werden die Strings als Text behandelt. Der Parser verwendet die für die Funktion @NUMERIC beschriebenen Regeln , um festzustellen, ob die Zeichenketten numerisch sind oder nicht, und nur wenn beide numerisch sind, wird ein numerischer Vergleich durchgeführt. Wenn einer der beiden Werte nicht numerisch ist, wird ein String-Vergleich durchgeführt. Um einen String-Vergleich zu erzwingen, wenn beide Werte numerisch sein können, verwenden Sie doppelte Anführungszeichen um die zu testenden Werte, wie unten gezeigt. Da das Anführungszeichen kein numerisches Zeichen ist, wird ein Zeichenfolgenvergleich durchgeführt. Ein numerischer Vergleich kann nicht erzwungen werden. Um hexadezimale Zahlen numerisch zu vergleichen, müssen Sie sie mit @CONVERT in dezimale Zahlen umwandeln . Dies ist nicht notwendig, wenn beide gleich lang sind - der String-Vergleich und der numerische Vergleich ergeben das gleiche Ergebnis.
Das folgende Beispiel zeigt den Unterschied zwischen numerischen und String-Vergleichen, wie in der Tabelle unten dargestellt. Numerisch gesehen ist 2 kleiner, aber als Zeichenkette ist sie "größer", weil ihre erste Ziffer größer ist als die erste Ziffer von 19. Die erste der beiden Bedingungen istalso wahr, die zweite falsch:
Ausdruck |
Wert |
Vergleichstyp |
2 lt 19 |
wahr |
numerisch |
"2" lt "19" |
falsch |
string |
Formate für relationale Ausdrücke
Das Format eines relationalen Ausdrucks ist eines der folgenden
num1 relationaler Operator num2
string1 relationaler Operator string2
Hinweis: Die korrekte Syntax erfordert einLeerzeichen vor und nach dem Operator, um ihn von seinen Operanden zu trennen. Häufig anzutreffende Konstruktionen wie %a==b können je nach den spezifischen Parametern funktionieren oder auch nicht, werden aber nie empfohlen.
Operator |
numerischer Vergleich: Ausdruck ist wahr, wenn |
String-Vergleich : DerAusdruck ist wahr, wenn die Groß- und Kleinschreibung nicht beachtet wird: |
EQ or == |
num1 gleich num2 |
Zeichenkette1 ist gleich Zeichenkette2 |
NE or != |
num1 ist nicht gleich num2 |
Zeichenkette1 ist nicht gleich Zeichenkette2 |
LT |
num1 ist kleiner als num2 |
string1 steht alphabetisch vor string2 |
LE |
num1 istkleiner als oder gleich num2 |
string1 geht alphabetisch vor oder ist gleich string2 |
GE |
num1 istgrößer als oder gleichnum2 |
string1 folgt alphabetisch oder ist gleich string2 |
GT |
num1 istgrößer als num2 |
string1 folgt alphabetisch auf string2 |
EQC |
getestet als Zeichenketten è |
string1 ist identisch mit string2, einschließlich Groß- und Kleinschreibung |
=~ |
Test auf reguläre Ausdrücke |
string1 stimmt mit dem regulären Ausdruck in string2 überein |
!~ |
Test auf reguläre Ausdrücke |
string1 stimmt nicht mit dem regulären Ausdruck in string2 überein |
Unterschiede in der Groß- und Kleinschreibung werden bei String-Vergleichen ignoriert (außer bei EQC). Wenn zwei Zeichenketten mit demselben Text beginnen, aber eine kürzer ist, wird die kürzere Zeichenkette als vorangestellt (kleiner als) die längere betrachtet. Zum Beispiel ist "a" kleiner als "abc", und "hello_there" ist größer als "hello".
Wenn Sie Textzeichenfolgen vergleichen, müssen Sie die Parameter möglicherweise in Anführungszeichen setzen, um Syntaxfehler zu vermeiden, die auftreten können, wenn einer der Parameterwerte leer ist (z. B. aufgrund einer Umgebungsvariablen, der nie ein Wert zugewiesen wurde). Diese Technik funktioniert nicht bei numerischen Vergleichen, da die Anführungszeichen einen String-Vergleich erzwingen. Bei numerischen Tests müssen Sie also sicherstellen, dass allen Variablen Werte zugewiesen sind, bevor der Test durchgeführt wird.
Um die Kompatibilität mit CMD, TCC erkennt die folgenden zusätzlichen Namen für Bedingungen an:
CMD |
TCC |
EQL or EQU |
EQ |
NEQ |
NE |
LSS |
LT |
LEQ |
LE |
GTR |
GT |
GEQ |
GE |
Interne Variablen und Variablenfunktionen sind sehr leistungsfähig, wenn sie mit String- und numerischen Vergleichen kombiniert werden. Sie ermöglichen es Ihnen, den Zustand Ihres Systems, die Eigenschaften einer Datei, Datums- und Zeitinformationen oder das Ergebnis einer Berechnung zu testen. Sie sollten sich die Variablen und Variablenfunktionen ansehen, wenn Sie herausfinden wollen, wie Sie einen Bedingungstest am besten einrichten.
Diese Bedingungen testen das Betriebssystem, das Dateisystem oder den TCC Status. Zusätzlich zu den unten aufgeführten Tests gibt es viele interne Variablen und Variablenfunktionen, mit denen Sie den Status vieler anderer Teile des Systems testen können.
In den folgenden Beschreibungen der verschiedenen Statustests sind die Statustests nur dann wahr, wenn die angegebene Bedingung wahr ist.
DEFINED variable |
Wenn die Variable in der Umgebung vorhanden ist, ist der Ausdruck wahr. Dies ist gleichbedeutend mit der Prüfung, ob die Variable nicht leer ist oder nicht. |
Hinweis: GOSUB-Variablen, Array-Variablen und interne Variablen existieren nicht in der Umgebung, so dass sie den DEFINED-Test immer nicht bestehen. |
|
ERRORLEVEL [relationaler Operator] n |
Dieser Test ermittelt den Exit-Code des vorangegangenen externen Programms. Konventionell geben Programme einen Exit-Code von 0 zurück, wenn sie erfolgreich waren, und eine Zahl ungleich Null, um einen Fehler anzuzeigen. Der Vergleichsoperator kann einer der oben aufgeführten sein (z. B. EQ, GT). Wenn kein Operator angegeben wird, ist die Vorgabe GE. Der Vergleich wird numerisch durchgeführt. |
Nicht alle Programme geben einen expliziten Exit-Code zurück. Bei Programmen, die dies nicht tun, ist das Verhalten von ERRORLEVEL undefiniert. |
|
EXIST filename |
Wenn filename mit einer existierenden Datei übereinstimmt, ist der Ausdruck wahr. In diesem Fall ist der Ausdruck wahr, wenn eine Datei existiert, die dem Namen des Platzhalters entspricht. filename kann einen absoluten oder relativen Pfad enthalten. |
WARNUNG: Unter Windows ist der Ausdruck wahr, wenn es entweder eine Datei oder ein Verzeichnis mit dem Namen filename gibt. Verwenden Sie stattdessen ISFILE oder ISDIR. |
|
Der spezielle Dateiname NUL wird häufig in CMD-Batchdateien verwendet, um die Existenz eines Verzeichnisses zu prüfen. Der Ausdruck exist xxx\NUL ist nur wahr, wenn xxx ein Verzeichnis ist. |
|
ISALIAS aliasname |
Wenn aliasname als Alias definiert ist, ist der Ausdruck wahr. |
ISAPP appname |
Wenn appname mit dem Namen einer gerade laufenden Anwendung übereinstimmt, ist der Ausdruck wahr. Um eine bestimmte Anwendung zu finden, müssen Sie den vollständigen Pfadnamen der Anwendung eingeben. Unvollständige Namen und Wildcards führen zu unzuverlässigen Ergebnissen. Eswerden sowohl die kurze als auch die lange Form des Dateinamens geprüft (siehe LFN-Dateisuche für Details über die Entsprechung zwischen kurzen und langen Dateinamen). |
Dieser Test erfordert möglicherweise das DEBUG-Recht. |
|
ISBATCH filename |
Wenn der angegebene Dateiname eine Stapeldatei ist, ist der Ausdruck wahr. |
ISDIR path DIREXIST path
|
Wenn das durch path angegebene Verzeichnis existiert, ist der Ausdruck wahr. Der Pfad kann entweder absolut oder relativ sein. DIREXIST kann als Synonym für ISDIR verwendet werden. |
ISFILE filename |
Wenn filename mit einer Datei übereinstimmt, die existiert, ist der Ausdruck wahr. In diesem Fall ist der Ausdruck wahr, wenn eine Datei, die dem Platzhalter entspricht, existiert. ISFILE findet nur Dateien, keine Verzeichnisse. |
ISFUNCTION name |
Wenn der benutzerdefinierte Funktionsname geladen ist, ist der Ausdruck wahr. |
ISINTERNAL command |
Wenn command ein aktiver interner Befehl ist, ist der Ausdruck wahr. Befehle können mit dem Befehl SETDOS /Iaktiviert und deaktiviert werden. |
ISLABEL label |
Wenn label in der aktuellen Batch-Datei vorhanden ist, ist der Ausdruck wahr. Bezeichnungen können ein oder mehrere Wörter lang sein. Beachten Sie, dass dieser Test nichts mit den Bezeichnungen von Festplattenpartitionen zu tun hat. |
ISLIBRARY name |
Wenn der Name eine Bibliotheksfunktion ist, ist der Ausdruck wahr. |
ISPLUGIN name |
Wenn derName eine Plugin-Variable, -Funktion oder -Befehl ist, ist der Ausdruck wahr. |
ISREADABLE filename |
Wenn der Dateiname lesbar ist, ist der Ausdruck wahr. |
ISSYMLINK filename |
Wenn die Datei ein symbolischer Link ist, ist der Ausdruck wahr. |
ISVISIBLE "title" |
Wenn das angegebene Fenster sichtbar ist, ist der Ausdruck wahr (dies bedeutet, dass Windows das Sichtbarkeitsflag gesetzt hat; es bedeutet nicht unbedingt, dass das Fenster auf dem Desktop sichtbar ist). |
ISWRITEABLE filename |
Wenn der Dateiname schreibbar ist, ist der Ausdruck wahr. |
ISHUNG "title" |
Wenn das angegebene Fenster nicht antwortet, ist der Ausdruck wahr.
|
PLUGIN module |
Wenn das Plugin-Modul geladen ist, ist der Ausdruck wahr. Der Name des Moduls darf keine Erweiterung (z. B. ".dll") enthalten. |
Ein logischer Ausdruck ist einer der folgenden:
ein Statustest
der unäre logische Operator NOT (oder !) gefolgt von einem logischen Ausdruck
zwei logische Ausdrücke, die durch einen binären logischen Operatorverbunden sind
Logische Operatoren
Operator |
Typ |
Verwendung |
Wert ist TRUE, wenn |
NOT |
unary |
NOT cond |
cond FALSE ist. |
.AND. |
binary |
cond1 .AND. cond2 |
cond1 und cond2 beide TRUE sind. |
.OR. |
binary |
cond1 .OR. cond2 |
mindestens eine der Bedingungen cond1 und cond2 TRUE ist. |
.XOR. |
binary |
cond1 .XOR. cond2 |
eine von cond1 und cond2 TRUE ist und die andere FALSE. |
In diesem Beispiel wird ein Programm namens DATALOADausgeführt , wenn heute Montag oder Dienstag ist (geben Sie dies in eine Zeile ein):
if "%_dow" == "Mon" .or. "%_dow" == "Tue" dataload
Testbedingungen werden immer von links nach rechts abgefragt - es gibt keine implizite Rangfolge, wie in einigen Programmiersprachen. Sie können jedoch eine bestimmte Testreihenfolge erzwingen, indem Sie die Bedingungen z. B. mit Klammern gruppieren (geben Sie dies in eine Zeile ein):
if (%a == 1 .or. (%b == 2 .and. %c == 3)) echo something
Kombinieren logischer Ausdrücke
Klammern können nur verwendet werden, wenn der Teil des Ausdrucks innerhalb der Klammern mindestens einen der binären logischen Operatoren .and., .or. oder .xor. enthält . Klammern in einem einfachen Ausdruck, der nicht zwei oder mehr Tests kombiniert, werden als Teil der zu testenden Zeichenkette betrachtet und führen wahrscheinlich dazu, dass der Test fehlschlägt. Zum Beispiel ist der erste dieser Tests FALSCH, der zweite ist WAHR:
(a == a)
(a == a .and. b == b)
Klammern können verschachtelt werden.
Dieses Batchdateifragment führt ein Programm namens WEEKLYaus , wenn heute Montag ist :
if "%_dow" == "mon" weekly
Dieses Batchdateifragment testet auf einen Stringwert:
input "Enter your selection : " %%cmd
if "%cmd" == "WP" goto wordproc
if "%cmd" NE "GRAPHICS" goto badentry
Dieses Beispiel ruft GO.BTM auf, wenn die ersten beiden Zeichen in der Datei MYFILEGO sind :
if "%@left[2,%@line[myfile,0]]" == "GO" call go.btm
Das erste Stapeldateifragment unten testet auf das Vorhandensein von A:\JAN.DOC , bevor es auf Laufwerk Ckopiert wird (dadurch wird eine Fehlermeldung vermieden, wenn die Datei nicht existiert):
if isfile a:\jan.doc copy a:\jan.doc c:\
Dieses Beispiel testet den Exit-Code des vorherigen Programms und stoppt die gesamte Verarbeitung der Batch-Datei, wenn ein Fehler auftritt:
if errorlevel == 0 goto success
echo "External Error; Batch File Ends!"
cancel