如何在DOS批处理文件中实现逻辑操作符?
当前回答
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
其他回答
你可以用嵌套条件做和:
if %age% geq 2 (
if %age% leq 12 (
set class=child
)
)
or:
if %age% geq 2 if %age% leq 12 set class=child
你可以用一个单独的变量:
set res=F
if %hour% leq 6 set res=T
if %hour% geq 22 set res=T
if "%res%"=="T" (
set state=asleep
)
注意,这个答案是针对cmd批处理语言定制的,在Windows中可以找到。你提到了“DOS批处理”,但是,基于几点,我认为前者的选择是一个安全的赌注(1)。
如果你真的是指原始的MS-DOS批处理语言,你应该记住If语句要简单得多,你可能需要使用If语句的块…Goto表示控制流,而不是(例如)括号或其他。
(1)以下几点支持:
The presence of the cmd and windows-console tags; Prior experience of some people failing to recognise the very real difference between cmd and MS-DOS batch languages, and conflating DOC with the cmd terminal window; The question using the more generic "DOS" rather than specifically "MS-DOS" (where "DOS" could possibly be any disk operating system; The fact this is Stack Overflow rather than the retro-computing sister site, where a question about MS-DOS would be way more appropriate (I'm often on that site as well, it's nice for those of us who remember and appreciate computer history); and The (eventual) acceptance of the answer by the original asker, indicating that the solution worked.
对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
另一种选择是寻找unix shell,它可以提供逻辑操作符和更多的功能。如果您不想走cygwin路线,您可以在这里获得Bourne shell的本地win32实现。本地bash可以在这里找到。我很确定你可以很容易谷歌其他好的替代品,如zsh或tcsh。
K
只有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
如果你需要else子句,你可以使用下面的语法:
AND:
if %v1% == a (if %v2% == b (echo yes) else echo no) else echo no
OR:
if %v1% == a (echo yes) else (if %v2% == b (echo yes) else echo no)
推荐文章
- 在Windows批处理脚本中格式化日期和时间
- 如何在windows中使用命令提示符(cmd)列出文件。我试过在Linux中使用“ls”,但它显示一个错误?
- BAT文件执行后保持CMD打开
- 如何在命令提示符中使用空格?
- 如何从批处理文件运行PowerShell脚本
- 如何自动提升批处理文件,以便在需要时请求UAC管理员权限?
- 批处理文件:查找子字符串是否在字符串中(不是在文件中)
- 为什么JavaScript中没有逻辑异或?
- “npm config set registry https://registry.npmjs.org/”在Windows bat文件中不工作
- 如何从批处理文件创建空文本文件?
- cmd /C是什么意思?
- Windows批处理:无新行回显
- 在批处理文件中测试参数是否为空的正确方法是什么?
- 批处理文件,将文件从一个文件夹复制到另一个文件夹
- 在Windows系统上快速创建大文件