Wie würden Sie logische Operatoren in DOS-Batch-Dateien implementieren?Logische Operatoren ("und", "oder") im DOS-Stapel
Antwort
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
)
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
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
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 ... –
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.Dat
undFile1.Dat
existieren springen dann das Label FILE12_EXIST_LABEL
.
Siehe auch: IF /?
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
Wenn Sie sich die Mühe machen, eine andere Shell zu verwenden, sollten Sie zumindest PowerShell verwenden: http://microsoft.com/powershell – Eclipse
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? –
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
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!
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
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
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.
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
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
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!;)
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.
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
Ich lege für Ihre Sehvergnügen: pi.bat :) http://thedailywtf.com/Articles/Stupid-Coding-Tricks-A -Batch-of-Pi.aspx –