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

Ren*_*ger 2 variables cmd batch-file

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

@set val=one
@if "%val%" equ "one" (
   @set val=yes
   echo val after setting it: %val%
) else (
   @set val=no
)
@echo %val%
Run Code Online (Sandbox Code Playgroud)

cmd.exe打印中运行它

val after setting it: one
yes
Run Code Online (Sandbox Code Playgroud)

但我期待

val after setting it: yes
yes
Run Code Online (Sandbox Code Playgroud)

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

gra*_*ity 6

介于(和之间的所有东西都)被解析为一行(加入命令&) - 并且shell 在分析时扩展%var%变量

输出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%
Run Code Online (Sandbox Code Playgroud)

......但那种方式就是疯狂.例如,如果要!在延迟扩展模式下回显,则必须将其转义两次:

echo hi^^!
Run Code Online (Sandbox Code Playgroud)

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


考虑一种不太流行的语言(Perl,Python,PowerShell,PHP,JScript,C#,......)