为什么相等运算符在三个条件下不起作用?

Why does the equality operator not work on three conditions?

所以我一直想做一些非常简单的事情 运行,但我不明白为什么:

@echo off
setlocal enabledelayedexpansion

set /a var1=10
set /a var2=10
set /a var3=10

:test1
if %var1%==%var2% (
    if %var2%==%var3% (
        echo This Works
        pause
    )
)

:test2
if %var1%==%var2%==%var3% (
    echo But this does not
    pause
)

在这种情况下,test1 标签可以正常工作,但 test2 标签不起作用。

谁能帮我理解为什么?

不了解批处理,但我可以分享一些其他编程语言的上下文,这通常不起作用。

这可能会解析为:

  • (%var1% == %var2%) == %var3%,或
  • %var1% == (%var2% == %var3%).

在任何一种情况下,首先评估两个变量之间的等式之一,导致 falsetrue 可能不等于第三个变量(即使它确实发生了到,那可能不是你想要的)。

解决方案是使用两个单独的等式,结合 AND 运算符,例如 %var1%==%var2% AND %var2%==%var3%

根据if command(类型if /?)的帮助,只能比较两个表达式,不能比较三个。

但是,您可以连接多个比较:

if %var1% equ %var2% if %var2% equ %var3% (
    rem // Do something...
)

这是以下内容的缩写形式(一旦您想使用 else 子句,它就会变得特别相关):

if %var1% equ %var2% (
    if %var2% equ %var3% (
        rem // Do something...
    )
)

在上面我使用了 equ 运算符而不是 == 因为你是在比较整数。 如果要比较字符串,请使用 == 和引号(以避免出现空字符串问题并保护特殊字符):

if "%var1%"=="%var2%" if "%var2%"=="%var3%" (
    rem // Do something...
)