逻辑运算符(“和”,“或”)在DOS批处理中
你将如何在DOSbatch file中实现逻辑运算符?
你可以做and
嵌套的条件:
if %age% geq 2 ( if %age% leq 12 ( set class=child ) )
要么:
if %age% geq 2 if %age% leq 12 set class=child
你可以做or
使用一个单独的variables:
set res=F if %hour% leq 6 set res=T if %hour% geq 22 set res=T if "%res%"=="T" ( set state=asleep )
IF
语句不支持逻辑运算符( AND
和OR
),级联IF
语句使得隐含的联合。
IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL
如果File1.Dat
和 File1.Dat
存在,则跳转标签FILE12_EXIST_LABEL
。
另见: IF /?
德摩根定律允许我们只使用连词(“AND”)和否定(“NOT”)将不相交(“OR”)转换为逻辑等价物。 这意味着我们可以将分离(“OR”)链接到一行。
这意味着如果名字是“Yakko”或“Wakko”或“Dot”,则回显“Warner brother or sister”。
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
这是paxdiablo的“OR”例子的另一个版本,但条件链接在一行上。 (请注意, leq
的反义词是gtr
,而geq
的lss
是lss
。)
set res=true if %hour% gtr 6 if %hour% lss 22 set res=false if "%res%"=="true" set state=asleep
以下示例显示如何创build一个AND语句(用于设置variables或包含某个命令的参数)。
closuresCMD窗口并启动记事本:
exit & start notepad.exe
如果variables“a”等于等于,则将variablesx,y和z设置为值。
if %a% equ blah set x=1 & set y=2 & set z=3
希望有所帮助!
也包括在内
“120}如何在IF语句中使用AND / OR / XOR / NOT运算符?
http://www.netikka.net/tsneti/info/tscmd120.htm
或者有点棘手,但不是太过分了。 这是一个例子
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
尝试否定操作数 – “不”!
那么,如果你可以使用嵌套的if语句来执行一个if语句的“AND”操作(参考之前的答案),那么你可以用'if'来做同样的事情来执行一个'或'操作。
如果你还没有这个想法,请继续阅读。 否则,不要浪费你的时间,回到编程。
正如嵌套的“只有当所有的条件都是真的时才满意的,只有当所有的条件都是假的时候嵌套的”如果不是的话。 这与你想用一个“或”操作数所做的相似,不是吗?
即使嵌套的“如果不是”的任何一个条件是真的,整个陈述仍然不满意。 因此,如果所有的嵌套条件都是错误的,那么你可以使用否定的if语句来记住条件语句的主体应该是你想要做的事情。 你实际上想要给的身体应该在else语句之下。
如果你还没有得到这个东西,对不起,我是16岁,这是我能做的最好的解释。
另一种方法是寻找一个unix shell,它可以为您提供逻辑运算符以及更多的function。 如果你不想去cygwin路由,你可以在这里得到一个Bourne shell的本地win32实现。 本地打击可以在这里find。 我很确定你可以轻松地谷歌其他好的select,如zsh或tcsh。
ķ
Athul Prakash(当时的16岁)给出了一个合理的想法,即如何通过否定IF语句中的条件来实现ORtesting,然后使用ELSE子句作为放置需要执行的代码的位置。 我认为自己通常需要两个其他的子句,因为他build议使用两个IF语句,所以执行的代码需要写两次 。 但是,如果使用GOTO跳过所需的代码,而不是写入ELSE子句,则只需要编写一次执行代码。
这里是一个可testing的例子,我将如何执行Athul Prakash的负逻辑来创build一个OR 。
在我的例子中, 如果有坦克执照,或者他们正在服兵役 , 就可以开车 。 在两个提示中inputtrue或false ,您将能够看到逻辑是否允许您驾驶坦克。
@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
它和以下一样简单:
AND> if + if
if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" *do something*
OR> 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*
我知道还有其他的答案,但我认为这个矿更简单,所以更容易理解。 希望这可以帮助你! ;)
如果你有兴趣在一个语句中写一个if
+ AND
/ OR
,那么就没有任何一个。 但是,你仍然可以用&&
/ ||
来分组 和(
/ )
语句来实现你想在一行中不带任何附加variables和无/ if-else
块复制(对于TRUE
和FALSE
代码段,单个echo
命令):
@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
输出 :
TRUE+ FALSE- FALSE- FALSE- TRUE+ TRUE+ TRUE+ FALSE-
诀窍是在type
命令中,它会丢弃/设置错误errorlevel
并处理到下一个命令的path。
对Andry的答案稍作修改,减less重复types的命令:
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