内部IF块时ECHO奇怪的行为

时间:2016-05-04 09:37:56

标签: batch-file windows-7 echo

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

请有人帮我理解原因。

1 个答案:

答案 0 :(得分:4)

您需要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
)

批处理文件有两个阶段读取脚本 - 执行和解析。在解析阶段,用%括起来的所有变量都被替换,并且在执行阶段执行命令。启用延迟扩展后,!括起的变量将在执行阶段(即稍后)扩展

另一侧的括号(以及&)将命令放在一个块中作为单个命令,因此在第一阶段和设置变量时,所有带%的变量都会被替换你需要延迟扩张。

相关问题