Einen (echten) AND-Vergleich gibt es wie ein logisches AND leider nicht. Dies ist nur Implizit möglich (vgl. IF (ELSE)). Hier möchte ich eine Funktion vorstellen, mit der sich eine Reihe von ODER-Vergleichen durchführen lässt. Für diese Funktion wird die Funktion (Datei) ReadCols.bat (in Or.zip enthalten) benötigt. Sie funktioniert wie die Funktion AND.bat, eben nur invers.
REM *************************************************
REM * Name: OR.bat *
REM * Type: Function* *
REM * Autor: Tim Pustelni *
REM * Date: 20.01.2017 *
REM *************************************************
REM * Description *
REM * Vergleicht einen Wert mit einer Liste von *
REM * Bedingungen und Werten. *
REM *************************************************
REM * Input: %1: Variablenname für Rückgabe *
REM * %2: Wert, der zu vergleichen ist *
REM * %3: Semikolongetrennte Bedingungen *
REM *************************************************
REM * Output: %1= *
REM * -1 Eine der Bedingungen ist erfüllt *
REM * 0 Alle Bedingungen sind nicht erf. *
REM * 1 Fehler *
REM *************************************************
REM * Anmerkung: - Bitte EQU stat == nutzen! *
REM * - Datei ReadCols.Bat im gleichen *
REM * Verzeichnis erforderlich. *
REM * - Setlocal EnableDelayedExpansion *
REM * erforderlich *
REM *************************************************
REM * Aufrufbeispiel (Anführungszeichen notwendig): *
REM * CALL OR.bat or 1 "LSS 1;GTR 1;NEQ 1" *
REM *************************************************
REM Wenn Fehler Ergebnis=1
SET Val_or=1
SET val=%2
SET Cond=%~3
IF NOT DEFINED val GOTO :ENDE
IF NOT DEFINED Cond GOTO :ENDE
REM Wenn keine der Bedingungen wahr ist bleibt das Ergebnis falsch (0)
SET Val_or=0
REM Bedingungen in ein Array einlesen.
CALL ReadCols.Bat Cond "%Cond%"
REM Vergleiche Bedingungen bis Variable !cond[#]! undefiniert
SET cnt=0
:OR_Schleife
SET /A cnt=%cnt%+1
REM Beendet Prüfung, wenn keine Bedingungen mehr
IF NOT DEFINED Cond[%cnt%] GOTO:ENDE
SET Condition=!Cond[%cnt%]!
REM Ergebnis (%Val_or%) wahr (-1) setzen, wenn Bedingung erfüllt
IF %val% %Condition% SET Val_or=-1
REM Die Funktion kann vorzeitig beendet werden, wenn eine bedingung wahr ist
IF %Val_or% EQU -1 GOTO :ENDE
GOTO :OR_Schleife
:ENDE
SET %1=%Val_or%
:EOF %1
CALL [VERZEICHNIS]OR.bat RÜCKGABEVARIABLENNAME ZU_VERGL_WERT "LISTE_ARGUMENTE"
Syntax für LISTE_ARGUMENTE: "Vergleichsoperator_n WERT_n;Vergleichsoperator_n WERT_n;Vergleichsoperator_n WERT_n"
Bsp. für LISTE_ARGUMENTE "EQU 1;NEQ 0;GEQ 10;LEQ 121;GTR 30;LSS 12"
@echo off & setlocal
Setlocal EnableDelayedExpansion
CALL OR.bat or 1 "EQU 0;GTR 0"
ECHO Eine Bedingung richtig: %or%
pause
CALL OR.bat or 1 "EQU 1;GTR 0"
ECHO Beide Bedingungen richtig: %or%
pause
CALL OR.bat or 1 "LSS 1;GTR 1"
ECHO Beide Bedingungen falsch: %or%
PAUSE
CALL OR.bat or 1 "LSS 1;GTR 1;NEQ 1"
ECHO ALLE Bedingungen falsch: %or%
PAUSE