如何在批处理文件中使用多个条件进行“If”语句判断?

13

我能否在批处理文件的if块中使用多个条件,如“或”/“与”?

如果不是太复杂,我至少可以使用类似以下的语法:

if value1 < value < value2

我的目的是检查当前系统时间是否在某个时间间隔内(确切地说是凌晨2点05分至早晨7点55分之间),如果是,则执行特定的命令。

4个回答

33

在dbenham的回答基础上,你可以使用ifgoto语句的组合来模拟逻辑运算符(AND,OR)。

要测试condition1 AND codition2

    if <condition1> if <condition2> goto ResultTrue

:ResultFalse
REM do something for a false result
    goto Done

:ResultTrue
REM do something for a true result

:Done

测试条件1或条件2

    if <condition1> goto ResultTrue
    if <condition2> goto ResultTrue

:ResultFalse
REM do something for a false result
    goto Done

:ResultTrue
REM do something for a true result

:Done

我曾经用这种(更清晰的)方式编写“if c1 if c2 goto AndTrue”:set and=ifif c1 %and% c2 goto AndTrue。你必须注意这些结构不能有ELSE部分!!! - Aacini
@Aacini 我的结构中在 ResultFalse 部分有一个 "else" 情况。 - Eitan T
我认为在AND模拟中使用GOTO没有任何好处 - 你可以简单地将IF语句串联起来,并将ELSE与最后一个IF放在一起。但是,对于OR,GOTO是一个很好的解决方案。另一个选择是使用临时变量:set "OR=" & ((if <condition1> set "OR=1") & if <condition2> set "OR=1") & if defined OR (echo TRUE) else (echo FALSE)。使用这种方法而不是GOTO的原因之一是如果你的OR测试在一个带括号的代码块内 - 你不能在一个带括号的代码块内跳转到一个标签。 - dbenham
@dbenham,你对批处理中的“goto”真的有些偏见,是吧? :) - Eitan T
1
糟糕 - 我之前的评论有两个错误。最后一行应该写成“在括号块内部不应该使用GOTO标签”。虽然可以这样做,但很可能会得到与您想要的结果不同的结果,并且会令人困惑。另一个问题涉及使用ELSE来模拟具有连接IF语句的AND - 这是行不通的!我向EitanT道歉 - 如果您想使用ELSE,则GOTO解决方案确实有优势。使用临时变量也可以实现AND与ELSE的非GOTO解决方案,就像我使用OR一样。 - dbenham

9

批处理中没有逻辑运算符。但是可以用两个IF语句轻松模拟AND。

if value1 lss value if value lss value2 REM do something

批处理IF语句不知道如何比较时间。批处理IF只能比较整数和字符串。

其中一个选择是将时间转换为从午夜开始的分钟或秒。

另一个选择是使用两位宽度格式化时间(如果需要,包括秒),每个数字都应该有2位(需要前导零)。小时应该是24小时制的(军事时间)。


1
你可以将条件分为两个部分,并使用if和if来设置两个条件。
if %value% GTR %value1% (
echo Value is greater that %value1% ) else call :Error
if %value% LSS %value2% (
echo Value is less than %value2% ) else call :Error
::Write your Command if value lie under specified range
exit

:Error
echo Value doesn't lie in the range 
::Write your command for if value doesn't lie in the range
exit

1
Set "IF=Set "or_=" & (If"
Set "OR=set "or_=1" )& (If "
Set "AND= If "
Set "THEN= set "or_=1" ) & If defined or_ "

Echo: Sample 1
%IF% 1 EQU 2 %OR% 6 NEQ 3 %OR% /I "stp" EQU "Stp" %THEN% Echo Pass

Echo: Sample 2
%IF% 1 EQU 2 %OR% 6 EQU 3 %AND% "stp" EQU "Stp" %THEN% (
    Echo Pass
) Else Echo Faill

您可以混合使用,但需要记住:

  • IF ~ 如果 (
  • OR ~ ) 或者 (
  • AND ~ 并且 (无父级)
  • THEN ~ ) 那么

因此,示例2将被视为: 如果 (ex1) 或者 (ex2 并且 ex3) 那么


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接