2008-12-15 82 views
2

阅读stackoverflow上的现有文章,并在网上进行了一些阅读。我认为是在我失去太多头发之前发布我的问题的时候了!Windows批处理文件 - ENABLEDELAYEDEXPANSION查询

我有一个批处理文件,我双击运行中下面的代码,在Windows XP SP3:

SETLOCAL ENABLEDELAYEDEXPANSION 

::Observe variable is not defined 
SET test 

::Define initial value 
SET test = "Two" 

::Observe initial value is set 
SET test 

::Verify if the contents of the variable matches our condition 
If "!test!" == "Two" GOTO TWO 

::First Place holder 
:ONE 

::Echo first response 
ECHO "One" 

::Second Place holder 
:TWO 

::Echo second response 
ECHO "Two" 

::Await user input 
PAUSE 

ENDLOCAL 

基本上我试图建立,如果我可以通过我的脚本中使用条件语句导航。似乎很明显,我在变量范围和延迟变量扩展方面遇到了一些问题,但我在做错的时候有点失落。

任何人都可以指向正确的方向吗?

回答

5

立即解决问题是,你该变量的值设置为<“两课”>,你可以在这里看到:

@echo off 

SETLOCAL ENABLEDELAYEDEXPANSION 

::Observe variable is not defined 
SET test 

::Define initial value 
SET test = "Two" 

::Observe initial value is set 
SET test 
echo %test% 
echo..%test %. 

::Verify if the contents of the variable matches our condition 
If "!test!" == "Two" GOTO TWO 

::First Place holder 
:ONE 

::Echo first response 
ECHO "One" 

::Second Place holder 
:TWO 

::Echo second response 
ECHO "Two" 

::Await user input 
PAUSE 

ENDLOCAL 

主要生产:

Environment variable test not defined 
test = "Two" 
. "Two". 
"One" 
"Two" 
Press any key to continue . . . 

的原因,你的“ set test“输出变量的原因与”set t“的原因相同 - 如果没有特定名称的变量,它将输出以该名称开头的所有变量。

set命令也是一个挑剔的小野兽,不喜欢'='字符周围的空格;它将它们(和方式中的引号)合并到环境变量名称和分配给它的值中。相反,使用:

set test=Two 

此外,如果您使用延迟扩展,自%test%和!test以来无所谓!将扩大相同。它是有用的喜欢的语句:

if "!test!" == "Two" (
    set test=TwoAndABit 
    echo !test! 
) 

内回声将输出TwoAndABit而%的测试%,当if语句遇到整,会使其输出两个被扩大。

不过,为了保持一致性,我总是使用延时扩展。

+0

感谢明确阐述响应大同!所有的阅读,测试和解决我的结局:) – 2008-12-15 11:50:50

0

SET命令通过最后一个非空字符取等号后的所有内容。你的命令

SET test = "Two" 

...是可变的测试与领先的空白和引号,不只是两个字符串设定为数值“2”。

所以,当你测试...

If "!test!" == "Two" GOTO TWO 

你真的测试...

If " "Two"" == "Two" GOTO TWO