Windows批处理文件:多个if条件

33

是否有办法在批处理文件中实现以下语句的功能:

if %1 == 1 or %1 == 2

或者更好地,如果我可以指定一组候选值,如下所示:

if %1 in [1, 2, 3, 4, ... 20]

确切重复:https://dev59.com/AHE85IYBdhLWcg3wdDIM - Jan Zyka
那么我猜这是不可能的? - MxLDevs
2
能否实现相同的功能? 是的。但是能否使用问题中列出的语法?不行。 - bk1e
4个回答

41
“and”原来很容易——只是它的语法不像你所期望的那样。以下三个例子说明了这一点。
用文字表述:如果1等于1并且2等于2,那么输出“hello”。
if 1==1 echo hello
hello

if 1==1 if 2==2 echo hello
hello

if 1==1 if 2==1 echo hello
(nothing was echoed)

1
这是真正的答案。使用 goto 最多只能算是一个 hack。 - kayleeFrye_onDeck

26

实现逻辑或的一种方法是使用多个条件语句,这些语句 goto 到相同的标签。

if %1 == 1 goto :cond
if %1 == 2 goto :cond
goto :skip
:cond
someCommand
:skip
为了测试元素是否属于一个集合,你可以使用for循环:
for %%i in (1 2 3 4 ... 20) do if %1 == %%i someCommand

请注意,== 是字符串相等运算符,而equ是数值相等运算符。


@Joey:它们通常表现相同,但并非总是如此:if 5 equ 05 echo yes会打印“yes”,但if 5 == 05 echo yes则不会。 - bk1e
啊,前导零。由于它们被解释为八进制数,因此 9 equ 09 失败了。不过忽略掉最初的注释就好了 :-) - Joey

10

我知道这是旧的,但是我想让你知道,与先前的帖子所说的不同,它确实是可能的。基本上,您正在将两个IF命令绑定为一个。

语法:IF方程(如果是true cmd)else command if false

尝试使用以下内容针对两个变量(执行IF xx AND xx语句)

set varone=1
set vartwo=2

if %varone% equ 1 (if %vartwo% equ 2 (echo TRUE)else echo FALSE)else echo FALSE

使用一个变量(执行OR语句 - 请注意,您也可以使用多个变量)

if %a% equ 1 (echo pass)else if %a equ 2 (echo pass)else echo false

您可以用您的命令替换回显的“通过”或“失败”


刚刚注意到这个。知道有一种方法可以做到这一点(并可能导致其他用途),但语法使它看起来非常混乱!在这种情况下,使用一组候选值的for循环会更清晰。 - MxLDevs

0
有点晚了,但是假设这可能会帮助到任何遇到这个问题的人。我使用echo和findstr的组合来实现这一点,方法如下:
(echo ":1: :2:" | findstr /i ":%1:" 1>nul 2>nul) && (
    echo Input is either 1 or 2
)

由于findstr是一个外部命令,我建议不要在可能进行数千次迭代的循环内使用它。如果不是这种情况,那么这应该解决您尝试做的事情,而不是使用多个if语句。此外,在选择“:”时没有什么特别之处,只需使用一个不太可能成为%1值的一部分的分隔符即可。

感谢其他人指向另一个链接,该链接似乎有类似的问题,我也会在那里发布这个响应,以防某人偶然发现那个问题并且没有到达这里。


这个解决方案是否可扩展到大量有效元素(例如:扩展名列表)? - MxLDevs
@Keikoku:只是为了更好地理解,例如,在上述原始问题中提到的情况下,您是否正在寻找可以是1、2、3......一直到一个很大的数字的输入?在这种情况下是不可行的。但是我们肯定可以探索更好的方法来适应这种情况。对您的情况进行简要描述会有所帮助-如果您已经提出了问题,可以提供一个链接。 - Arun
我不记得这个问题被打开时我正在处理什么问题。我想在某个时间点上,我想要检查输入是什么,并根据输入执行某些操作(我可以选择编写一个exe或批处理文件)。 - MxLDevs

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