代码是,
set VAR=before
if "%VAR%" == "before" (
set VAR=after;
echo %VAR%
)
以下DOS .bat文件代码段将显示什么?为什么? (即,为什么它没有您首先想到的那样表现)?
很明显,假设我们在循环内重置了env变量,您会认为输出将是“ after”。
但是输出实际上将是“之前”。原因是变量的替换是在读取命令而不是在执行命令时由解释程序在.bat文件中完成的。因此,对于复合语句,当第一次遇到if语句时,将评估主体中的变量。
您可以通过使用延迟的环境变量扩展来启用这项功能(需要启用它)。如果启用,则可以执行以下操作:
设置VAR =之前
如果“%VAR%” ==“之前”(
set VAR = after;
echo!VAR!
)
启动cmd.exe时,可以使用/ v选项启用延迟的环境变量扩展。
[[背景故事-我们中许多人仍然使用旧版.bat文件来驱动诸如make过程等之类的事情。显然,有更好的脚本编写工具,但并非总是可以使用它们的选择。不久前,我遇到了这个问题,最近又发现另外两个人因为同一件事而拔掉头发。因此,了解解释器如何进行变量替换非常有用。]
%VAR%的替换发生在命令执行之前。即使有几条命令分布在多行中,它们在parens (...)
中的分组也会使cmd.exe解析器将整个内容作为单个命令读取。因此执行的内容如下:
set VAR=before
if "before" == "before" (
set VAR=after;
echo before
)
对口译员。
这是使批处理文件变得非常痛苦的许多事情之一,除了尝试简单的操作之外,母鸡还想做更多的事情。