你如何在DOS批处理文件中实现逻辑运算符?
你如何在DOS批处理文件中实现逻辑运算符?
你可以使用嵌套条件进行 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
)
cmd
批处理语言。您提到了“DOS批处理”,但基于几个要点,我认为前者是一个安全的选择(1)。if
语句要简单得多,您可能需要使用一些if ... goto
块来控制流程,而不是(例如)括号或else
。
(1)支持以下观点:
cmd
和windows-console
标签;cmd
和MS-DOS批处理语言之间的实际差异,并将DOC与cmd
终端窗口混淆;set res=
或 set res=1
然后使用 if defined res
,这样更能避免拼写错误,并且即使在没有显式启用延迟扩展的代码块中也能正常工作。 - JoeyIF
语句不支持逻辑运算符AND
和OR
。级联的IF
语句隐含了一个连接词:
IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL
如果 File1.Dat
和 File2.Dat
存在,则跳转到标签 FILE12_EXIST_LABEL
。IF /?
。德摩根定理允许我们使用合取("AND")和否定("NOT")将析取("OR")转换成逻辑等价式。这意味着我们可以将多个析取("OR")串联在一行上。
这意味着如果名称是"Yakko"、"Wakko"或"Dot",那么输出"Warner兄弟或姐妹"。
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
OR运算符有点棘手,但并不是太难。以下是一个例子:
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
var1
),但这并不意味着这个概念行不通。 - paxdiablostart notepad.exe & exit
如果变量'a'等于blah,则将变量x、y和z设置为相应的值。
IF "%a%"=="blah" (set x=1) & (set y=2) & (set z=3)
if
+AND
/OR
,那么这是不可能的。但是,您仍然可以使用&&
/||
和(
/)
语句来分组if
,以实现您想要的结果,而无需添加任何额外的变量和if-else
块重复(单个echo
命令用于TRUE
和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
更统一的版本:
@echo off
setlocal
set "A=1" & set "B=2" & ( call :IF_AND "%%A%% EQU 1" "%%B%% EQU 2" && echo TRUE+ ) || echo FALSE-
set "A=1" & set "B=3" & ( call :IF_AND "%%A%% EQU 1" "%%B%% EQU 2" && echo TRUE+ ) || echo FALSE-
set "A=2" & set "B=2" & ( call :IF_AND "%%A%% EQU 1" "%%B%% EQU 2" && echo TRUE+ ) || echo FALSE-
set "A=2" & set "B=3" & ( call :IF_AND "%%A%% EQU 1" "%%B%% EQU 2" && echo TRUE+ ) || echo FALSE-
echo.
set "A=1" & set "B=2" & ( call :IF_OR "%%A%% EQU 1" "%%B%% EQU 2" && echo TRUE+ ) || echo FALSE-
set "A=1" & set "B=3" & ( call :IF_OR "%%A%% EQU 1" "%%B%% EQU 2" && echo TRUE+ ) || echo FALSE-
set "A=2" & set "B=2" & ( call :IF_OR "%%A%% EQU 1" "%%B%% EQU 2" && echo TRUE+ ) || echo FALSE-
set "A=2" & set "B=3" & ( call :IF_OR "%%A%% EQU 1" "%%B%% EQU 2" && echo TRUE+ ) || echo FALSE-
exit /b 0
:IF_OR
if %~1 ( exit /b 0 ) else if %~2 ( exit /b 0 ) else exit /b 1
exit /b -1
:IF_AND
if %~1 ( if %~2 ( exit /b 0 ) else exit /b 1 ) else exit /b 1
exit /b -1
输出:
TRUE+
FALSE-
FALSE-
FALSE-
TRUE+
TRUE+
TRUE+
FALSE-
type
命令,它会丢弃/设置errorlevel
并处理到下一个命令的方式。if %A% EQU 1
,if %B% EQU 2
,其中 :IF_OR
分别代表 if %A% EQU 1
或 if %B% EQU 2
。 - Andry@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
(注:保留原文中的HTML标签)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 "%a%" == "ONE" goto do_thing
if "%a%" == "TWO" (
:do_thing
echo a is equal to ONE or TWO
)
只有 OR 部分比较棘手,但是对于包含 NOT OR AND 的一般布尔表达式,唯一好的解决方案就是这个:
REM if A == B OR C == C then yes
(call :strequ A B || call :strequ C C) && echo yes
exit /b
:strequ
if "%1" == "%2" exit /b 0
exit /b 1