2

阅读了关于stackoverflow的现有帖子并在网上进行了一些阅读。我认为是时候在我失去太多头发之前发布我的问题了!

我在 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

基本上我试图确定我是否可以使用条件来浏览我的脚本。很明显,我在变量范围和延迟变量扩展方面遇到了一些问题,但我对自己做错了什么有点迷茫。

谁能指出我正确的方向?

4

2 回答 2

5

您的直接问题是您将变量设置为值 <"Two"> 您可以在此处看到:

@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!
)

内部 echo 将输出 TwoAndABit 而 %test%,当遇到整个 if 语句时扩展,将导致它输出 Two。

尽管如此,我总是在任何地方都使用延迟扩展来保持一致性。

于 2008-12-15T11:31:25.470 回答
0

SET 命令获取等号之后的所有内容,直到最后一个非空白字符。你的命令...

SET test = "Two"

...正在将变量 test 设置为带有前导空格和引号的值“Two”,而不仅仅是字符串 Two。

所以当你测试...

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

你真的在测试...

If " "Two"" == "Two" GOTO TWO
于 2009-04-10T19:07:18.283 回答