逻辑运算符(“和”,“或”)在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语句不支持逻辑运算符( ANDOR ),级联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 ,而geqlsslss 。)

 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

在我的例子中, 如果有坦克执照,或者他们正在服兵役就可以开车 。 在两个提示中inputtruefalse ,您将能够看到逻辑是否允许您驾驶坦克。

 @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块复制(对于TRUEFALSE代码段,单个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