Пакетный файл не может установить переменную среды в условном выражении - PullRequest
14 голосов
/ 18 мая 2009

Почему следующий пакетный файл Windows выводит Foo с последующим Bar, а не Baz?

@echo off
setlocal

set _=Foo
echo %_%
set _=Bar
if 1==1 (
    set _=Baz
    echo %_%
)

Вывод в моей системе (Microsoft Windows XP [Версия 5.1.2600]):

Foo
Bar

Если я удаляю условное выражение, то ожидается ожидаемый результат Foo и Baz.

Ответы [ 3 ]

28 голосов
/ 18 мая 2009

То, что происходит, заключается в том, что подстановка переменной выполняется при чтении строки. То, что вы не принимаете во внимание, это то, что:

if 1==1 (
    set _=Baz
    echo %_%
)

- это одна"линия", несмотря на то, что вы думаете. Расширение "%_%" выполняется перед оператором set.

Вам нужно отсроченное расширение. Почти каждый из моих командных сценариев начинается с "setlocal enableextensions enabledelayedexpansion", чтобы использовать всю мощь cmd.exe.

Итак, моя версия сценария будет:

@echo off
setlocal enableextensions enabledelayedexpansion

set _=Foo
echo !_!
set _=Bar
if 1==1 (
    set _=Baz
    echo !_!
)

endlocal

Это генерирует правильный "Foo", "Baz" вместо "Foo", "Bar".

4 голосов
/ 18 мая 2009

Ответ на этот вопрос совпадает с ответом на: Странная проблема с областью действия в пакетном файле . Смотрите там для более подробной информации. По существу, расширение переменной выполняется во время чтения строки, а не во время выполнения.

3 голосов
/ 18 мая 2009

попробуйте

@echo off
setlocal

set _=Foo
echo %_%
set _=Bar
if "1" NEQ "2" goto end
set _=Baz
echo %_%
:end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...