2011-02-04 126 views
2

我有一个xyz.bat文件与此内容:意外处理在cmd.exe的批处理文件 “变量”

@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 

这是为什么?有没有办法让它像我认为的那样行事? ()之间

回答

6

一切被解析为一个单一的线(与&接合命令) - 和壳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^^! 

(这被解析两次,减少到的第一次。)而且甚至没有让我开始上使用^里面的变量。


考虑较少缺憾语言(Perl,Python和PowerShell的,PHP,JScript中,C#,...)

+0

“扩张在解析时间“..多数民众赞成的解释,其余的只是fillup :)它更糟糕的cmd.exe与”for“-constructs .. cmd.exe创建一个”伪RAM脚本“的语句,并执行没有运行时评估。取决于OP最终想实现的目标:我会去jscript/vbs路由,这就是默认安装的@windows。因为,.py等更好,但也许OP有一些计划在他的脑海中。 – akira 2011-02-04 11:10:03