我有一个包含以下内容的 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
这是为什么呢?有没有办法让它按照我的想法行事?
最佳答案
(
和 )
之间的所有内容都被解析为一行(使用 &
连接命令) – 以及 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#...)
关于batch-file - cmd.exe 批处理文件中意外处理 "variables",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4908595/