首页 > 解决方案 > Windows 批处理 if 语句受 if 块中的语句影响

问题描述

当我在 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-statementbatch-file

解决方案


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

该变量%v%在命令运行之前被解析IF,并且包含有问题的右括号。因此发生的事情是代码读取,echo %v:~0%asecho (并关闭IFwith)它然后解析下一行是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
)

推荐阅读