我有一个名为test.bat
的Windows批处理脚本,如下所示:
@ECHO OFF
SETLOCAL
SET name=Dan
SET greeting=Hi %name%, how are you?
ECHO %greeting%
执行时,我得到以下输出:
Hi Dan, how are you?
这是我的预期。我将脚本更改为以下内容:
@ECHO OFF
SETLOCAL
IF EXIST test.bat (
SET name=Dan
SET greeting=Hi %name%, how are you
ECHO %greeting%
) ELSE (
ECHO Nofile
)
我希望获得相同的输出。相反,我得到以下内容:
ECHO is off.
请有人帮我理解原因。
答案 0 :(得分:4)
@ECHO OFF
SETLOCAL enableDelayedExpansion
IF EXIST test.bat (
SET name=Dan
SET greeting=Hi !name!, how are you
ECHO !greeting!
) ELSE (
ECHO Nofile
)
批处理文件有两个阶段读取脚本 - 执行和解析。在解析阶段,用%
括起来的所有变量都被替换,并且在执行阶段执行命令。启用延迟扩展后,!
括起的变量将在执行阶段(即稍后)扩展
另一侧的括号(以及&
)将命令放在一个块中作为单个命令,因此在第一阶段和设置变量时,所有带%
的变量都会被替换你需要延迟扩张。