【问题标题】:ECHO strange behavior when inside IF block在 IF 块内 ECHO 奇怪的行为
【发布时间】:2016-05-04 09:37:55
【问题描述】:

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

请有人帮我理解为什么。

【问题讨论】:

    标签: batch-file windows-7 echo


    【解决方案1】:

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

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

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

    【讨论】:

    • 你能详细说明吗?比起解决方案,我更感兴趣的是了解正在发生的事情。
    • @DanStevens - 它在链接中进行了解释,但我会更新答案
    • 太好了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    相关资源
    最近更新 更多