DOS批处理中的逻辑运算符(“和”,“或”)

问题描述 投票:228回答:11

如何在DOS批处理文件中实现逻辑运算符?

batch-file cmd logical-operators windows-console
11个回答
271
投票

你可以用嵌套条件做and

if %age% geq 2 (
    if %age% leq 12 (
        set class=child
    )
)

要么:

if %age% geq 2 if %age% leq 12 set class=child

你可以用一个单独的变量做or

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

0
投票

另一种方法是寻找一个unix shell,它可以为你提供逻辑运算符和更多功能。如果你不想去cygwin路线,你可以获得Bourne shell here的原生win32实现。可以找到本地bash here。我很确定你可以轻松谷歌其他好的替代品,如zsh或tcsh。


-1
投票

对Andry的答案进行了轻微修改,减少了重复类型命令:

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

66
投票

IF语句不支持逻辑运算符(ANDOR),级联IF语句构成隐式连接。

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

如果File1.DatFile1.Dat存在,那么跳跃标签FILE12_EXIST_LABEL

另见:IF /?


50
投票

De Morgan's laws允许我们仅使用连词(“AND”)和否定(“NOT”)将析取(“OR”)转换为逻辑等价物。这意味着我们可以将析取(“OR”)链接到一行。

这意味着如果名字是“Yakko”或“Wakko”或“Dot”,那么回声“华纳兄弟或姐妹”。

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。)

set res=true
if %hour% gtr 6 if %hour% lss 22 set res=false
if "%res%"=="true" set state=asleep

5
投票

以下示例显示如何创建AND语句(用于设置变量或包含命令的参数)。

要启动记事本并关闭CMD窗口:

start notepad.exe & exit

如果变量'a'等于blah,则将变量x,y和z设置为值。

IF "%a%"=="blah" (set x=1) & (set y=2) & (set z=3)

希望有所帮助!


4
投票

或者有点棘手,但并不过分。这是一个例子

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

1
投票

尝试否定操作数 - '不'!

好吧,如果您可以使用嵌套的'if'(请参阅之前的答案)对if语句执行'AND'操作,那么您可以使用'if not'执行相同的操作来执行'或'操作。

如果您还没有完成这个想法,请继续阅读。否则,不要浪费你的时间并重新开始编程。

就像嵌套的'if'只有在所有条件都满足时才满足一样,只有当所有条件都为假时,才会满足嵌套的'if not'。这类似于你想用'或'操作数做的,不是吗?

即使嵌套的'if not'中的任何一个条件为真,整个语句仍然不满意。因此,如果所有嵌套条件都为假,则可以通过记住条件语句的主体应该是您想要做的事情来连续使用否定的'if'。你真正想要给予的身体应该在else声明之下。

如果你仍然没有得到这个东西的小说,抱歉,我16岁,这是我能解释的最好的。


1
投票

Athul Prakash(当时16岁)通过否定IF语句中的条件,然后使用ELSE子句作为放置需要执行的代码的位置,给出了如何实现OR测试的逻辑思路。我认为,由于他建议使用两个IF语句,因此通常需要两个其他子句,因此执行的代码需要写入两次。但是,如果使用GOTO跳过所需的代码,而不是编写ELSE子句,则执行代码只需要编写一次。

这是一个可测试的例子,说明如何实现Athul Prakash的负逻辑来创建OR。

在我的例子中,有人被允许驾驶坦克,如果他们有坦克牌照或他们正在服兵役。在两个提示输入true或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

1
投票

它就像以下一样简单:

AND> if + if

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

或者>如果//如果

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*

我知道还有其他答案,但我认为我的更简单,更容易理解。希望这对你有所帮助! ;)


1
投票

如果你有兴趣在一个声明中写一个if + AND / OR,那么就没有任何声明。但是,您仍然可以将if&& / ||( / )语句组合在一起来实现您想要的任何其他变量和w / o if-else块复制(echoTRUE代码部分的单个FALSE命令):

@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,因此处理下一个命令的方式。

© www.soinside.com 2019 - 2024. All rights reserved.