在 IF 块内时出现 ECHO 奇怪的行为

ECHO strange behavior when inside IF block

我有一个名为 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.

请谁能帮我理解为什么。

你需要delayed expansion:

@ECHO OFF
SETLOCAL enableDelayedExpansion
IF EXIST test.bat (
    SET name=Dan
    SET greeting=Hi !name!, how are you
    ECHO !greeting!
) ELSE (
    ECHO Nofile
)

批处理文件有两个读取脚本的阶段——执行和解析。在解析阶段,所有包含在 % 中的变量都被替换,在执行阶段,命令被执行。打开延迟扩展后,包含在 ! 中的变量将在执行阶段(即稍后)扩展

另一侧的括号(以及 &)将命令放在一个块中,作为一个单独的命令,因此所有带有 % 的变量在第一阶段以及当您设置你需要延迟扩展的变量。