2010-01-26 9 views

Antwort

223

Sie and mit verschachtelten Bedingungen tun können:

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 tun mit einer separaten Variable:

set res=F 
if %hour% leq 6 set res=T 
if %hour% geq 22 set res=T 
if "%res%"=="T" (
    set state=asleep 
) 
+11

Sie können auch 'set res =' oder 'set res = 1' und dann' falls definiert res' verwenden, das etwas robuster gegen Tippfehler ist und sogar in Blöcken funktioniert, ohne explizit verzögert zu aktivieren Erweiterung. – Joey

+5

Nur um deine Antwort ein wenig zu verbessern ... du musst die "if" -Anweisungen nicht explizit verschachteln ... du kannst sie einfach "verketten", wie Dave Jarvis unter – JoelFan

+0

zeigt, keine Leerzeichen nach dem Set zu lassen = wahr oder das Ding funktioniert nur anmutig nicht. Es würde Wert "wahr" in der Variablen speichern ... –

55

Die IF Anweisung nicht unterstützt logische Operatoren (AND und OR), Cascading IF Aussagen machen eine implizite Verbindung.

IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL 

Wenn File1.DatundFile1.Dat existieren springen dann das Label FILE12_EXIST_LABEL.

Siehe auch: IF /?

1

Eine Alternative ist es, nach einer Unix-Shell zu suchen, die Ihnen logische Operatoren und noch viel mehr bietet. Sie können eine native Win32-Implementierung einer Bourne-Shell here erhalten, wenn Sie nicht auf die Cygwin-Route gehen möchten. Eine native bash kann here gefunden werden. Ich bin ziemlich sicher, dass Sie andere gute Alternativen wie zsh oder tcsh leicht googlen könnten.

K

+3

Wenn Sie sich die Mühe machen, eine andere Shell zu verwenden, sollten Sie zumindest PowerShell verwenden: http://microsoft.com/powershell – Eclipse

+14

Es gibt viele bessere Shells als DOS. Der Grund, warum ich eine DOS-Bat-Datei verwenden würde, ist, dass es keine externen Tools benötigt. Wenn Sie einen Kunden haben, der etwas Einfaches automatisieren muss, möchten Sie wirklich, dass spezielle Werkzeuge (Cygwin, Perl, Powershell, etc.) installiert werden müssen, wenn eine BAT-Datei ausreicht? –

+3

BAT ist die meiste Zeit genug. 90% der Unix-Shell-Skripte ppl schreiben ist keine reine Shell, sondern mit vielen Coreutils, sed, awk usw. Aufrufe. GNU hat UNIX-Extras in anderen Betriebssystemen, einschließlich Windows, implementiert. Also schauen Sie sich http://getgnuwin32.sourceforge.net/cmd.exe/bash/zsh an und das sollte bei den meisten Aufgaben ausreichen. Kein Grund, so genannte PowerShell zu lernen, wenn Sie BAT/UNIX Shell Erfahrung haben – MeaCulpa

4

Die folgenden Beispiele zeigen, wie eine AND-Anweisung zu machen (für Variablen oder einschließlich Parameter für einen Befehl Einstellung).

das CMD-Fenster zu schließen und den Editor starten:

exit & start notepad.exe 

Um Variablen x, y und z auf Werte gesetzt, wenn die Variable 'a' blah entspricht.

if %a% equ blah set x=1 & set y=2 & set z=3 

Hoffe, dass hilft!

41

De Morgan's laws ermöglichen es uns, Disjunktionen ("ODER") in logische Äquivalente mit nur Konjunktionen ("AND") und Negierungen ("NOT") zu konvertieren. Dies bedeutet, dass wir Disjunktionen ("ODER") auf eine Zeile ketten können.

Dies bedeutet, wenn der Name "Yakko" oder "Wakko" oder "Dot" ist, dann Echo "Warner Bruder oder Schwester".

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 weitere Version von paxdiablo der „OR“ Beispiel, aber die Bedingungen sind auf einer Zeile verkettet. (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 
3

Auch bedeckt in
„120} Wie kann ich AND/OR/XOR/NOT Operatoren in einer IF-Anweisung ?"
http://www.netikka.net/tsneti/info/tscmd120.htm

OR ist etwas schwierig, 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 
2

die Negation Operanden Versuchen -. 'Nicht'

Nun, wenn Sie! kann eine AND-Operation für eine if-Anweisung ausführen, die geschachtelte "ifs" verwendet (siehe vorherige Antworten), dann können Sie dasselbe mit "falls nicht" tun, um eine Operation "oder" auszuführen.

Wenn Sie die Idee noch nicht ganz verstanden haben, lesen Sie weiter. Ansonsten verschwenden Sie nicht Ihre Zeit und gehen Sie zurück zur Programmierung.

Genau wie geschachtelte 'if's nur dann erfüllt sind, wenn alle Bedingungen erfüllt sind, werden geschachtelte' wenn nicht erfüllt 'nur dann erfüllt, wenn alle Bedingungen falsch sind. Das ist ähnlich dem, was Sie mit einem 'oder' Operanden machen wollen, oder?

Auch wenn eine der Bedingungen im verschachtelten "wenn nicht" erfüllt ist, bleibt die gesamte Aussage nicht erfüllt. Daher können Sie negiertes 'if' in Folge verwenden, indem Sie daran denken, dass der Körper der Bedingungserklärung das sein soll, was Sie tun möchten, wenn all Ihre verschachtelten Bedingungen falsch sind. Der Körper, den du eigentlich geben wolltest, sollte unter else stehen.

Und wenn Sie immer noch nicht die Jist der Sache bekommen, sorry, ich bin 16 und das ist das Beste, was ich tun kann, um zu erklären.

+0

x = 2 oder x = 3 =>! ! (x = 2 oder x = 3) =>! (x! = 2 und x! = 3) Ich glaube nicht, dass Sie die ganze Struktur negieren können, um den notwendigen äußeren "Nicht" -Operator anzuwenden. Es ist 3 Jahre her, @ Athul-Prakash, Gedanken? – Azeroth2b

1

Athul Prakash (damals 16 Jahre alt) gab eine logische Idee für die Implementierung eines OR-Tests, indem die Bedingungen in IF-Anweisungen negiert und die ELSE-Klausel als Speicherort für den Code verwendet wurde. Ich dachte mir, dass es jedoch normalerweise zwei andere Klauseln gibt, 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 nicht in ELSE-Klauseln geschrieben werden, sondern muss nur einmal geschrieben werden.

Hier ist ein testbares Beispiel, wie ich die negative Logik von Athul Prakash implementieren würde, um eine OR zu erstellen.

In meinem Beispiel, ist jemand erlaubt, einen Tank zu fahren, wenn sie eine Tanklizenz haben oder sie ihren Militärdienst tun. Geben Sie true oder false an den beiden Eingabeaufforderungen ein und Sie können sehen, ob die Logik es Ihnen ermöglicht, einen Tank zu fahren.

@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 
1

Es ist genauso einfach wie die folgenden:

UND> if + wenn

if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" *do something* 

OR> wenn // wenn

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, aber ich denke, dass die Mine einfacher ist, also leichter zu verstehen. Hoffe das hilft dir!;)

1

Wenn Sie interessiert sind, eine if + AND/OR in einer Aussage zu schreiben, dann gibt es keine davon. Aber man kann immer noch Gruppe if mit &&/|| und (/) Aussagen zu erreichen, dass Sie in einer Zeile wollen w/o zusätzliche Variablen und w/o if-else Block Vervielfältigung (Einzel echo 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 

Ausgang:

TRUE+ 
FALSE- 
FALSE- 
FALSE- 

TRUE+ 
TRUE+ 
TRUE+ 
FALSE- 

der Trick in deristBefehl, der die errorlevel ablegt/setzt und so den Weg zum nächsten Befehl behandelt.

-1

leichte Modifikation Andry Antwort, wodurch doppelte -Art-Befehle:

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