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^^!