【问题标题】:Unexpected handling of "variables" in cmd.exe batch filecmd.exe 批处理文件中“变量”的意外处理
【发布时间】:2011-02-04 10:51:56
【问题描述】:

我有一个包含以下内容的xyz.bat 文件:

@set val=one
@if "%val%" equ "one" (
   @set val=yes
   echo val after setting it: %val%
) else (
   @set val=no
)
@echo %val%

cmd.exe 打印运行它

val after setting it: one
yes

但我期待

val after setting it: yes
yes

这是为什么?有没有办法让它表现得像我认为的那样?

【问题讨论】:

    标签: batch-file variables cmd


    【解决方案1】:

    () 之间的所有内容都被解析为一行(将命令与 & 连接起来)——以及 shell expands %var% variables at parse time

    set /? 的输出进一步解释了这一点。

    在最近的版本中:

    @echo off
    setlocal enabledelayedexpansion
    set var=one
    if a equ a (
        set var=two
        echo immediate expansion: %var%
        echo delayed expansion:   !var!
    )
    echo after: %var%
    

    ...但那样就是疯狂。例如,如果要在延迟扩展模式下回显!,则必须escape it twice

    echo hi^^!
    

    (这会被解析两次,第一次减少到echo hi^!。)甚至不要让我开始在变量中使用^


    考虑一种不太繁琐的语言(Perl、Python、PowerShell、PHP、JScript、C#、...)

    【讨论】:

    • "expands at parse time" .. 这就是解释,其余的只是填充 :) 在带有“for”-constructs 的 cmd.exe 中更糟糕 .. cmd.exe 创建了一个“伪ram 中的脚本”从语句中取出并执行,没有运行时评估。取决于 OP 最终想要实现的目标:我会走 jscript/vbs 路线,默认情况下安装了@windows。 coz、.py 等的更好,但也许 OP 在他的脑海中有某种计划。
    • 如果启用延迟扩展并且 !找到了,那么该行被解析两次,对行中的所有^很重要,但对其他特殊字符不重要,所以你转义echo one ^& two ^^^^ three^^! -> one & two ^ three!
    猜你喜欢
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 2016-12-07
    • 2011-02-15
    • 1970-01-01
    • 2017-06-11
    • 2015-01-18
    • 1970-01-01
    相关资源
    最近更新 更多