Ваша непосредственная проблема заключается в том, что вы устанавливаете переменную на значение <"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!
)
Внутренний эхо будет выводить TwoAndABit, тогда как% test%, который раскрывается, когда встречается весь оператор if, заставляет его выводить Two.
Тем не менее, я всегда везде использую отложенное расширение только для согласованности.