Einen UND-Vergleich gibt es wie ein logisches ODER 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 OR.bat, eben nur invers.
REM *************************************************
REM * Name: AND.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 ALLE Bedingungen sind erfüllt *
REM * 0 Mind. eine Bedingungen 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 AND.bat and 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 alle Bedingungen wahr sind bleibt das Ergebnis wahr (-1)
SET Val_or=-1
REM Bedingungen in ein Array einlesen.
CALL ReadCols.Bat Cond "%Cond%"
REM Vergleiche Bedingungen bis Variable !cond[#]! undefiniert
SET cnt=0
:AND_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 NOT %val% %Condition% SET Val_or=0
REM Die Funktion kann vorzeitig beendet werden, wenn eine bedingung falsch ist
IF %Val_or% EQU 0 GOTO :ENDE
GOTO :AND_Schleife
:ENDE
SET %1=%Val_or%
:EOF %1
CALL [VERZEICHNIS]AND.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 AND.bat AND 1 "EQU 0;GTR 0"
ECHO Eine Bedingung richtig: %AND%
pause
CALL AND.bat AND 1 "EQU 1;GTR 0"
ECHO Beide Bedingungen richtig: %AND%
pause
CALL AND.bat AND 1 "LSS 1;GTR 1"
ECHO Beide Bedingungen falsch: %AND%
PAUSE
CALL AND.bat AND 1 "LEQ 1;GEQ 1;EQU 1"
ECHO ALLE Bedingungen wahr %AND%
PAUSE