Bedingte Ausdrücke

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:

 

Onesteprelationaler Ausdruck
OnestepStatustest
Onesteplogischer Ausdruck

 

Relationaler Ausdruck

 

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.

 

Relationale Operatoren

 

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.

 

Zustandstest

 

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.

 

Logische Ausdrücke

 

Ein logischer Ausdruck ist einer der folgenden:

 

 Onestep        ein relationaler Ausdruck

 Onestep        ein Statustest

 Onestep        der unäre logische Operator NOT (oder !) gefolgt von einem logischen Ausdruck

 Onestep        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.

 

Beispiele

 

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