cmd.exe批处理文件中“变量”的意外处理

时间:2011-02-04 10:51:57

标签: batch-file variables cmd

我有一个包含此内容的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

这是为什么?有没有办法让它按照我的想法行事?

1 个答案:

答案 0 :(得分:6)

()之间的所有内容都被解析为一行(使用&加入命令) - 以及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#,......)