Batch file 意外处理;变量“;在cmd.exe批处理文件中

Batch file 意外处理;变量“;在cmd.exe批处理文件中,batch-file,variables,cmd,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 为什么会这样?有没有办法让它按照我

我有一个包含以下内容的
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连接在一起

的输出进一步解释了这一点

在最新版本中:

@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%
  • 新旧事物:

…但那就是疯狂。例如,如果要回显
在延迟扩展模式下,您必须:

(这会被解析两次,第一次被简化为
echo hi^!
),而且我甚至不需要开始使用
^
内部变量

  • 新旧事物:


考虑一种不那么麻烦的语言(Perl、Python、PowerShell、PHP、JScript、C#、…)

“在解析时展开”。。这就是解释,其余的只是填充:)在cmd.exe中使用“for”-构造更糟糕。。cmd.exe使用语句创建“ram中的伪脚本”,并执行该脚本,无需运行时评估。取决于OP最终想要实现什么:我会选择jscript/vbs路径,默认情况下安装@windows。当然,.py等更好,但也许OP脑子里有某种计划。如果延迟扩展被启用,a!如果找到,则该行将被解析两次,这对该行中的所有字符都很重要,但对其他特殊字符则不重要,因此您可以转义
echo one^&two^^^^three^->
1&2^3
echo hi^^!