Пакет Windows SET внутри, если не работает - PullRequest
77 голосов
/ 02 февраля 2012

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

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

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

ECHO is on.

Значение переменной var2 на самом деле не установлено,Может кто-нибудь, пожалуйста, помогите мне понять, почему?

Ответы [ 2 ]

142 голосов
/ 02 февраля 2012

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

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

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

setlocal EnableDelayedExpansion
set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo !var2!
)
2 голосов
/ 28 марта 2018

Я немного опоздал на вечеринку, но еще один способ справиться с этим условием - продолжить процесс за пределами 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. В итоге, если вы переосмыслите дизайн своего скрипта, вы можете сделать это следующим образом

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