пакет Windows SET внутри ЕСЛИ не работает


103

когда я запускаю этот сценарий (из файла .bat):

set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo %var2%
)

Я всегда получаю:

ECHO is on.

Это означает, что var2переменная на самом деле не была установлена. Может ли кто-нибудь помочь мне понять, почему?

Ответы:


185

var2 установлен, но раскрытие строки echo %var2%происходит до выполнения блока.
В это время var2пусто.

Следовательно, существует синтаксис delayedExpansion, он использует !вместо %и оценивается во время выполнения, а не во время синтаксического анализа.

Обратите внимание, что для использования !необходима дополнительная инструкция setlocal EnableDelayedExpansion.

setlocal EnableDelayedExpansion
set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo !var2!
)

11
Спасибо, что избавили меня от огромной боли.
Myna

То же правило &и &&операторы. Этот код set x=some & set y=%x%thing & echo results %y%выводит %x%thing.
gwarah

13

Я немного опаздываю на вечеринку, но другой способ справиться с этим состоянием - продолжить процесс снаружи if, например

set var1=true
if "%var1%"=="true" (
    set var2=myvalue
)
echo %var2%

Или / и используйте gotoсинтаксис

set var1=true
if "%var1%"=="true" (
    set var2=myvalue
    goto line10
) else (
    goto line20
)
. . . . .
:line10
echo %var2%
. . . . . 
:line20

Таким образом, расширение происходит «во времени» и вам не нужно setlocal EnableDelayedExpansion. Итог, если вы переосмыслите дизайн своего скрипта, вы можете сделать это так


Я не могу получить доступ к переменной, созданной внутри оператора if. Ваш первый пример с var2 не работает.
AntonioCS

@AntonioCS интересно ... это точный сценарий, который я только что тестировал echo off set var1=true if "%var1%"=="true" ( set var2=myvalue ) echo %var2% pause... и он работает. «если вы создадите переменную в командном файле, чтобы к ней можно было получить доступ в любом месте программы». . aticleworld.com/batch-file-variables-and-scope
TS
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.