Antworten:
Sie können and
mit verschachtelten Bedingungen tun :
if %age% geq 2 (
if %age% leq 12 (
set class=child
)
)
oder:
if %age% geq 2 if %age% leq 12 set class=child
Sie können or
mit einer separaten Variablen arbeiten:
set res=F
if %hour% leq 6 set res=T
if %hour% geq 22 set res=T
if "%res%"=="T" (
set state=asleep
)
set res=
oder set res=1
und dann verwenden, if defined res
was etwas robuster gegen Tippfehler ist und sogar in Blöcken funktioniert, ohne die verzögerte Erweiterung explizit zu aktivieren.
Die IF
Anweisung unterstützt keine logischen Operatoren ( AND
und OR
), kaskadierende IF
Anweisungen bilden eine implizite Konjunktion.
IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL
Wenn File1.Dat
und File1.Dat
vorhanden, dann überspringen Sie das Etikett FILE12_EXIST_LABEL
.
Siehe auch: IF /?
De Morgans Gesetze erlauben es uns, Disjunktionen ("ODER") in logische Äquivalente umzuwandeln, indem wir nur Konjunktionen ("UND") und Negationen ("NICHT") verwenden. Dies bedeutet, dass wir Disjunktionen ("ODER") in einer Zeile verketten können.
Dies bedeutet, wenn der Name "Yakko" oder "Wakko" oder "Dot" ist, dann geben Sie "Warner Bruder oder Schwester" wieder.
set warner=true
if not "%name%"=="Yakko" if not "%name%"=="Wakko" if not "%name%"=="Dot" set warner=false
if "%warner%"=="true" echo Warner brother or sister
Dies ist eine andere Version von paxdiablos "ODER" -Beispiel, aber die Bedingungen sind an eine Zeile gekettet. (Beachten Sie, dass das Gegenteil von leq
ist gtr
und das Gegenteil von geq
ist lss
.)
set res=true
if %hour% gtr 6 if %hour% lss 22 set res=false
if "%res%"=="true" set state=asleep
Die folgenden Beispiele zeigen, wie eine AND-Anweisung erstellt wird (zum Festlegen von Variablen oder zum Einschließen von Parametern für einen Befehl).
So starten Sie Notepad und schließen das CMD-Fenster:
start notepad.exe & exit
Um die Variablen x, y und z auf Werte zu setzen, wenn die Variable 'a' gleich bla ist.
IF "%a%"=="blah" (set x=1) & (set y=2) & (set z=3)
Hoffentlich hilft das!
ODER ist etwas knifflig, aber nicht übermäßig. Hier ist ein Beispiel
set var1=%~1
set var2=%~2
::
set or_=
if "%var1%"=="Stack" set or_=true
if "%var2%"=="Overflow" set or_=true
if defined or_ echo Stack OR Overflow
Athul Prakash (damals 16 Jahre alt) gab eine logische Idee für die Implementierung eines ODER-Tests, indem er die Bedingungen in IF-Anweisungen negierte und dann die ELSE-Klausel als Speicherort für den Code verwendete, der ausgeführt werden muss. Ich dachte mir, dass es normalerweise zwei andere Klauseln gibt, die normalerweise benötigt werden, da er vorschlägt, zwei IF-Anweisungen zu verwenden, und daher muss der ausgeführte Code zweimal geschrieben werden . Wenn jedoch ein GOTO verwendet wird, um den erforderlichen Code zu überspringen, muss der Code für die Ausführung anstelle von ELSE-Klauseln nur einmal geschrieben werden .
Hier ist ein testbares Beispiel dafür, wie ich die negative Logik von Athul Prakash implementieren würde, um einen OP zu erstellen .
In meinem Beispiel darf jemand einen Panzer fahren, wenn er einen Panzerschein hat oder seinen Militärdienst leistet . Geben Sie bei den beiden Eingabeaufforderungen true oder false ein, und Sie können sehen, ob Sie mit der Logik einen Panzer fahren können.
@ECHO OFF
@SET /p tanklicence=tanklicence:
@SET /p militaryservice=militaryservice:
IF /I NOT %tanklicence%==true IF /I NOT %militaryservice%==true GOTO done
ECHO I am driving a tank with tanklicence set to %tanklicence% and militaryservice set to %militaryservice%
:done
PAUSE
Wenn Sie daran interessiert sind, ein if
+ AND
/ OR
in eine Anweisung zu schreiben , gibt es keine davon. Sie können jedoch weiterhin if
mit &&
/ ||
und (
/ )
Anweisungen gruppieren , um das gewünschte Ergebnis in einer Zeile ohne zusätzliche Variablen und ohne if-else
Blockduplizierung (einzeln) zu erzielenecho
Befehl für TRUE
und FALSE
Codeabschnitte):
@echo off
setlocal
set "A=1" & set "B=2" & call :IF_AND
set "A=1" & set "B=3" & call :IF_AND
set "A=2" & set "B=2" & call :IF_AND
set "A=2" & set "B=3" & call :IF_AND
echo.
set "A=1" & set "B=2" & call :IF_OR
set "A=1" & set "B=3" & call :IF_OR
set "A=2" & set "B=2" & call :IF_OR
set "A=2" & set "B=3" & call :IF_OR
exit /b 0
:IF_OR
( ( if %A% EQU 1 ( type nul>nul ) else type 2>nul ) || ( if %B% EQU 2 ( type nul>nul ) else type 2>nul ) || ( echo.FALSE-& type 2>nul ) ) && echo TRUE+
exit /b 0
:IF_AND
( ( if %A% EQU 1 ( type nul>nul ) else type 2>nul ) && ( if %B% EQU 2 ( type nul>nul ) else type 2>nul ) && echo.TRUE+ ) || echo.FALSE-
exit /b 0
Ausgabe :
TRUE+
FALSE-
FALSE-
FALSE-
TRUE+
TRUE+
TRUE+
FALSE-
Der Trick liegt in dem type
Befehl, der das löscht / setzt errorlevel
und so den Weg zum nächsten Befehl handhabt.
Versuchen Sie den Negationsoperanden - 'nicht'!
Wenn Sie eine 'AND'-Operation für eine if-Anweisung mit verschachtelten' if's ausführen können (siehe vorherige Antworten), können Sie dasselbe mit 'if not' tun, um eine 'or'-Operation auszuführen.
Wenn Sie die Idee noch nicht ganz haben, lesen Sie weiter. Ansonsten verschwenden Sie einfach keine Zeit und kehren Sie zur Programmierung zurück.
Genauso wie verschachtelte "wenn" nur erfüllt sind, wenn alle Bedingungen erfüllt sind, verschachtelte "wenn nicht" nur erfüllt sind, wenn alle Bedingungen falsch sind. Dies ähnelt dem, was Sie mit einem 'oder' Operanden machen möchten, nicht wahr?
Selbst wenn eine der Bedingungen im verschachtelten "Wenn nicht" zutrifft, bleibt die gesamte Aussage nicht erfüllt. Daher können Sie nacheinander negierte Ifs verwenden, indem Sie sich daran erinnern, dass der Hauptteil der Bedingungsanweisung das sein sollte, was Sie tun möchten, wenn alle Ihre verschachtelten Bedingungen falsch sind. Der Körper, den Sie tatsächlich geben wollten, sollte unter die else-Anweisung fallen.
Und wenn Sie immer noch nicht verstanden haben, tut mir leid, ich bin 16 und das ist das Beste, was ich tun kann, um es zu erklären.
Es ist genauso einfach wie das Folgende:
UND> wenn + wenn
if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" *do something*
ODER> if // if
set BOTH=0
if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" set BOTH=1
if "%BOTH%"=="0" if "%VAR1%"=="VALUE" *do something*
if "%BOTH%"=="0" if "%VAR2%"=="VALUE" *do something*
Ich weiß, dass es andere Antworten gibt, aber ich denke, dass die Mine einfacher und leichter zu verstehen ist. Hoffe das hilft dir! ;)
Eine Alternative besteht darin, nach einer Unix-Shell zu suchen, die Ihnen logische Operatoren und vieles mehr bietet. Sie können hier eine native win32-Implementierung einer Bourne-Shell erhalten , wenn Sie nicht auf die Cygwin-Route gehen möchten. Eine native Bash finden Sie hier . Ich bin mir ziemlich sicher, dass Sie andere gute Alternativen wie zsh oder tcsh leicht googeln können.
K.
Leichte Änderung an Andrys Antwort, wodurch doppelte Typbefehle reduziert werden:
set "A=1" & set "B=2" & call :IF_AND
set "A=1" & set "B=3" & call :IF_AND
set "A=2" & set "B=2" & call :IF_AND
set "A=2" & set "B=3" & call :IF_AND
echo.
set "A=1" & set "B=2" & call :IF_OR
set "A=1" & set "B=3" & call :IF_OR
set "A=2" & set "B=2" & call :IF_OR
set "A=2" & set "B=3" & call :IF_OR
goto :eof
:IF_OR
(if /i not %A% EQU 1 (
if /i not %B% EQU 2 (
echo FALSE-
type 2>nul
)
)) && echo TRUE+
goto :eof
:IF_AND
(if /i %A% EQU 1 (
if /i %B% EQU 2 (
echo TRUE+
type 2>nul
)
)) && echo FALSE-
goto :eof