首页 文章

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

提问于
浏览
221

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

11 回答

  • 1

    它就像以下一样简单:

    AND>如果是

    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*
    

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

  • 47

    您可以使用嵌套条件执行 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
    )
    
  • 3

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

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

    如果存在 File1.DatFile1.Dat ,则跳转标签 FILE12_EXIST_LABEL .

    另见:IF /?

  • 248

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

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

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

    exit & start notepad.exe
    

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

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

    希望有所帮助!

  • 4

    也包括在内
    "120} How do I use AND/OR/XOR/NOT operators in an IF statement?"
    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
    
  • 1

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

    ķ

  • 1

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

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

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

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

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

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

  • 1

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

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

    在我的例子中, someone is allowed to drive a tank if they have a tank licence OR they are doing their military service . 在两个提示输入 truefalse ,您将能够看到逻辑是否允许您驾驶坦克 .

    @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
    
  • 60

    如果你有兴趣在一个语句中写一个 if AND / OR ,那么就没有任何一个 . 但是,您仍然可以将 if&& / ||( / ) 语句分组,以便在一行中实现您想要的任何其他变量和没有 if-else 块复制(单个 echo 命令用于 TRUEFALSE 代码段):

    @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
    

    Output

    TRUE+
    FALSE-
    FALSE-
    FALSE-
    
    TRUE+
    TRUE+
    TRUE+
    FALSE-
    

    诀窍是在 type 命令中删除/设置 errorlevel 等处理通往下一个命令的方式 .

  • -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
    

相关问题