Пакетный файл Windows - запрос ENABLEDELAYEDEXPANSION - PullRequest
2 голосов
/ 15 декабря 2008

Прочитав существующий пост в 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

В основном я пытаюсь установить, могу ли я перемещаться по своему сценарию, используя условные выражения. Кажется очевидным, что у меня возникают некоторые проблемы с областью действия переменных и отложенным расширением переменных, но я немного растерялся из-за того, что я делаю неправильно.

Кто-нибудь может указать мне правильное направление?

Ответы [ 2 ]

5 голосов
/ 15 декабря 2008

Ваша непосредственная проблема заключается в том, что вы устанавливаете переменную на значение <"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.

Тем не менее, я всегда везде использую отложенное расширение только для согласованности.

0 голосов
/ 10 апреля 2009

Команда SET берет все после знака равенства через последний непустой символ. Ваша команда ...

SET test = "Two"

... устанавливает для переменной test значение «Two» с пробелом в начале и кавычками, а не только строкой Two.

Итак, когда вы тестируете ...

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

вы действительно тестируете ...

If " "Two"" == "Two" GOTO TWO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...