代码之家  ›  专栏  ›  技术社区  ›  shoosh

复杂的条件?

  •  13
  • shoosh  · 技术社区  · 14 年前

    在DOS批处理文件中,在 IF 语句,是否可以使用and或or组合两个或多个条件?我找不到任何相关文件

    编辑 - help if ms文档没有提到在if中使用多个条件。

    我想有个解决办法

    if COND1 (
      if COND2 (
        cmd
      )
    )
    

    但这正是我想要避免的。

    6 回复  |  直到 8 年前
        1
  •  14
  •   Joey Gumbo    12 年前

    不,没有更简单的方法了。

    为了 and 您也可以直接将它们链接起来而不引入块:

    if COND1 if COND2 ...
    

    坦率地说

    if COND1 and COND2 ...
    

    然而,对于 or 它变得更丑,事实上:

    set COND=
    if COND1 set COND=1
    if COND2 set COND=1
    if defined COND ...
    

    或:

    if COND1 goto :meh
    if COND2 goto :meh
    goto :meh2
    :meh
    ...
    :meh2
    

    我曾经看到一个批处理预处理器,它使用类似于c的语法来处理控制流和中间的批处理内容,然后将这些条件转换为多个跳转和检查。但是,这是dos批处理文件,在windows环境中几乎没有用处。

        2
  •  9
  •   Mehrdad Mirreza zdan    10 年前

    我有时想知道,现在人们在学校学什么!当然“或”也有可能。任何可以为您提供“not”和“and”的系统都会自动为您提供“or”,因为:

    x或y=不((不是x)和(不是y)) 看见 http://en.wikipedia.org/wiki/De_Morgan%27s_laws

    所以只要表达式“如果(x和y)那么do z”可以这样写:

    if (x) if (y) (do z)
    

    …我们应该能够写出表达式“如果(x或y)那么做z”, 但是 有一个问题:

    我们把第一个“不”放在哪里?好吧,答案是无处可寻,我们应该首先改革上面的方程式:

    不(x或y)=(不x)和(不y)

    据此,我们可以将“如果(不是(x或y))那么(do z)”写成:

    “如果((不是x)和(不是y))则(do z)”

    有了这个,知道如何表达,如上所示,我们现在可以把“如果(不是(x或y))那么(do z)”写成:

    if (not x) if (not y) (REM do z)
    

    我们也知道这个表达:

    “如果(不是p),则(do q)else(do r)”

    …相当于:

    “如果(p)那么(do r)否则(do q)

    因此我们可以写“如果(x或y)那么(do z)”:

    “如果(不是(x或y))则(不做)其他(做z)”

    所以我们可以表达 “如果(x或y),则(do z)” AS:

    if (not x) if (not y) (REM do nothing) else (REM do z)
    

    但这还没有完成,因为这不是一个真正的“和”而是一个“模拟”的。缺少的是第二个。因此,获得正确结果的完整形式应该是:

    if (not x) ( if (not y) (REM do nothing) else (REM do z) ) else (REM do z) )
    

    …它有丑陋的另一部分。你可以用“goto”来解决这个问题,我们 最后 有:

    rem if (x OR y) then (do z):
    if (not x) ( if (not y) (goto :doNothing) )
    rem do z
    :doNothing
    
        3
  •  2
  •   Gilles Maisonneuve    12 年前

    我同意乔伊的看法,但我看不出另一个解决办法。

    对于或解决方法,我建议使用以下“技巧”:
    假设您希望测试用户在调用批处理文件时是否在命令行上请求帮助,例如: thebatch /? .
    但你不知道用户是否会键入 /? 或者更确切地说(作为一个习惯于unix的用户) --help -h 甚至忘了跟别人争论。

    你的代码可能是:

    for %%P in ("" "-h" "--help") do if "%1"==%%P (
       :help
       echo this is my help...  >&2
       exit /b 9
    )
    

    但是请注意,测试“/?”还是“-?”弦不能用那个把戏( FOR 循环不喜欢 ? 元字符)。
    为此,只需添加一行: if "%1"=="/?" goto help 在块的顶部(请参见 ':help' 标签 里面 for ?)

    还请注意,对于tcc.exe(take命令解释器,完整版或精简版)下的批处理文件,此语法不起作用(完全忽略此语法,不执行代码),但在这种情况下,只需将其语法与 .OR. .AND. 关键词。

    希望这有帮助。

        4
  •  0
  •   stealth    10 年前

    如果条件正在检查变量的特定值,则可以像case语句一样设置它。我需要检查类型是单个成员还是组 (或全部) .

    注: 标签不区分大小写。

    如果任何条件是真的 (如果 TYPE==ALL TYPE==GROUP1 TYPE==GROUP2 ) ,然后执行代码块,否则执行将跳过该块。

    goto :TYPE_EQ_%TYPE% 2>NUL
    if %ERRORLEVEL% neq 0 goto :END_CASE_TYPE
    :TYPE_EQ_ALL
    :TYPE_EQ_GROUP1
    :TYPE_EQ_GROUP2
    rem do what you need
       echo GROUP: %TYPE%
    :END_CASE_TYPE
    

    我不喜欢迈赫达德的电气工程 (数字电子学) 方法。虽然软件工程是精确的,但正如op所指出的,其思想是使事情更容易解决。嵌套的if语句增加了复杂性 (McCabe) . 添加额外的nots没有帮助。

    如果您不知道goto标签/错误设置,我的解决方案有点奇怪,但它是一个平面结构,大致设置为一个if语句,具有几个不难破译的or'd条件。

        5
  •  0
  •   alecov    8 年前

    还有:

    IF <COND1> IF <COND2> ACTION
    

    或:

    (SET _=) & (IF <COND1> (SET _= ) ELSE IF <COND2> (SET _= )) & IF DEFINED _ ACTION
    

    为了实现或这样做,您确实需要命令扩展。

        6
  •  -6
  •   Vicky    14 年前

    只要启用了命令扩展,就可以使用比较运算符。

    这是直接从“帮助if”粘贴的:

    如果命令扩展被启用,如果更改如下:

    IF [/I] string1 compare-op string2 command
    IF CMDEXTVERSION number command
    IF DEFINED variable command
    

    其中比较op可以是:

    EQU - equal
    NEQ - not equal
    LSS - less than
    LEQ - less than or equal
    GTR - greater than
    GEQ - greater than or equal
    

    如果指定了/i开关,则指示执行不区分大小写的字符串 比较。/I开关也可以用于string1==string2表单 IF。这些比较是通用的,如果string1和 字符串2都是由所有数字组成的,那么字符串是 转换为数字并执行数字比较。