阅读了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
基本上我试图确定我是否可以使用条件导航我的脚本。很明显,我在变量范围和延迟变量扩展方面遇到了一些问题,但我对自己做错的事情有点迷失。
有人能指出我正确的方向吗?
答案 0 :(得分: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 t”的原因相同 - 如果没有特定名称的变量,它将输出以该名称开头的所有变量。
set命令也是一个挑剔的小野兽,并不喜欢'='字符周围的空格;它将它们(以及顺便提到的引号)合并到环境变量名称和分配给它的值中。相反,使用:
set test=Two
另外,在你使用延迟扩展的地方,因为%test%和!test!会扩大相同的。它在以下语句中很有用:
if "!test!" == "Two" (
set test=TwoAndABit
echo !test!
)
内部回显将输出TwoAndABit,而%test%在遇到整个if语句时展开,将导致它输出两个。
尽管如此,为了保持一致性,我总是在各处使用延迟扩展。
答案 1 :(得分:0)
SET命令在等号通过最后一个非空白字符后获取所有内容。你的命令......
SET test = "Two"
...将变量test设置为值“Two”,带前导空格和引号,而不仅仅是字符串Two。
所以当你测试......
If "!test!" == "Two" GOTO TWO
你真的在测试......
If " "Two"" == "Two" GOTO TWO