пакетна команда Windows всередині, якщо не працює


102

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

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

Я завжди отримую:

ECHO is on.

Значення var2змінної насправді не було встановлено. Чи хтось, будь ласка, допоможе мені зрозуміти, чому?

Відповіді:


184

var2 встановлюється, але розширення в рядку echo %var2%відбувається до виконання блоку.
В цей час var2порожньо.

Тому синтаксис відкладеного розширення існує, він використовується !замість, %і він оцінюється під час виконання, а не час аналізу.

Зверніть увагу, що для використання потрібна !додаткова заява setlocal EnableDelayedExpansion.

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

11
Дякую, що ти просто позбавив мене величезного болю.
Мина

Те саме правило &і для &&операторів. Цей код set x=some & set y=%x%thing & echo results %y%виводиться %x%thing.
гвара

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.