Почему echo не печатает текст внутри оператора if (пакетный файл Windows)?

Вопрос:

У меня есть следующий пакетный файл окон:

 @echo off
set MYVAR1=test
set MYVAR2=
set MYVAR3=a b c

setlocal enableDelayedExpansion
for /l %%x in (1, 1, 3) do (
if !MYVAR%%x! == "" (
echo Not defined
) else (
echo Variable is: !MYVAR%%x!
)
)

Я ожидаю, что он напечатает следующий результат:

Variable is: test
Not defined
Variable is: a b c

вместо этого я вижу следующий вывод:

Variable is:  test
Variable is:
Variable is: a b c

Это не имеет никакого смысла для меня! Как я могу изменить пакетный скрипт, чтобы получить желаемый результат?

Ответ №1

Нужно также заключить задержанное выражение в кавычки.

if "!MYVAR%%x!" == "" (

вместо

if !MYVAR%%x! == "" (

поэтому код примера теперь выглядит так:

@echo off
set MYVAR1=test
set MYVAR2=
set MYVAR3=a b c

setlocal enableDelayedExpansion
for /l %%x in (1, 1, 3) do (
if "!MYVAR%%x!" == "" (
echo Not defined
) else (
echo Variable is: !MYVAR%%x!
)
)

Ответ №2

Альтернативой вашему исправленному коду является не проверка на пустое значение, а использование, if defined

@echo off
set "MYVAR1=test"
set "MYVAR2="
set "MYVAR3=a b c"

setlocal enableDelayedExpansion
for /l %%x in (1, 1, 3) do if not defined MYVAR%%x (
echo Variable %%x Not defined
) else (
echo Variable %%x is: !MYVAR%%x!
)

Оцените статью
TechArks.Ru
Добавить комментарий