0

代码是,

set VAR=before

if "%VAR%" == "before" (

  set VAR=after;

  echo %VAR%

)

前面的 Windows .bat 文件代码段会显示什么?为什么?(即为什么它的行为不像你最初想象的那样)?

4

2 回答 2

2

显然,你会认为输出会是“之后”,因为我们在循环中重置了 env 变量。

但输出实际上是“之前”。原因是解释器在读取命令时而不是在执行命令时在 .bat 文件中完成变量替换。因此,对于复合语句,在第一次遇到 if 语句时计算主体中的变量。

您可以通过使用延迟的环境变量扩展来完成这项工作(需要启用它)。如果已启用,您可以执行以下操作:

set VAR=before

if "%VAR%" == "before" (

  set VAR=after;

  echo !VAR!

)

您可以在启动 cmd.exe 时使用 /v 选项启用延迟的环境变量扩展。

[背景故事——我们中的许多人仍然使用遗留的 .bat 文件来驱动诸如 make 程序等。显然有更好的脚本工具,但并不总是可以选择使用它们。不久前我遇到了这个问题,最近发现另外两个人在同一件事上拔了头发。因此了解解释器如何进行变量替换很有用]。

于 2008-10-20T19:53:59.037 回答
0

替换%VAR%发生在命令执行之前。尽管有几个命令分布在多行中,但将它们分组在括号中(...)会导致 cmd.exe 解析器将整个内容作为单个命令读取。因此,在解释器看来,执行的内容如下所示。

set VAR=before

if "before" == "before" (

set VAR=after;

echo before

)

这是使批处理文件处理变得相当痛苦的许多事情之一,试图做的不仅仅是简单的事情。

于 2008-10-20T19:55:38.470 回答