我有一个包含此内容的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
这是为什么?有没有办法让它按照我的想法行事?
答案 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#,......)