【问题标题】:Windows batch if statement influenced by statements in the if blockWindows 批处理 if 语句受 if 块中的语句影响
【发布时间】:2021-06-10 16:08:34
【问题描述】:

当我在 Windows Server 2012 上执行以下 Windows 批处理脚本时:

@echo off
SET v=()
IF 1 == 2 (
  echo hi
  echo %v:~0%
  echo 1 equals 2
) ELSE (
  echo 1 does not equal 2
)


IF 1 == 2 (
  echo %v:0%
  echo 1 equals 2
) ELSE (
  echo 1 does not equal 2
)

我得到以下输出:

1 equals 2
1 does not equal 2
1 does not equal 2

谁能告诉我为什么会这样?我不想进入以echo hi开头的块,即使v的值是()。

【问题讨论】:

    标签: if-statement batch-file


    【解决方案1】:

    我不太确定您的意图是什么,但我认为可以通过以下方式解决您的问题。

    变量%v% 在运行IF 命令之前被解析,其中包含有问题的右括号。因此发生的情况是,代码将echo %v:~0% 读取为echo (,并用) 关闭IF,然后解析下一行echo 1 equals 2,并按预期打印。

    为防止这种情况发生,请在定义该变量时转义该括号:

    @echo off
    SET "v=(^)"
    IF 1 == 2 (
      echo hi
      echo %v:~0%
      echo 1 equals 2
    ) ELSE (
      echo 1 does not equal 2
    )
    
    
    IF 1 == 2 (
      echo %v:0%
      echo 1 equals 2
    ) ELSE (
      echo 1 does not equal 2
    )
    

    或者,最好还是开启延迟扩展,这样变量内容在命令运行前不被解析,只有在:

    @echo off
    SET "v=()"
    setlocal enabledelayedexpansion
    IF 1 == 2 (
      echo hi
      echo !v:~0!
      echo 1 equals 2
    ) ELSE (
      echo 1 does not equal 2
    )
    
    
    IF 1 == 2 (
      echo !v:0!
      echo 1 equals 2
    ) ELSE (
      echo 1 does not equal 2
    )
    

    【讨论】:

      猜你喜欢
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      相关资源
      最近更新 更多