У меня есть следующий пакетный файл окон:
@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
Это не имеет никакого смысла для меня! Как я могу изменить пакетный скрипт, чтобы получить желаемый результат?
Нужно также заключить задержанное выражение в кавычки.
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!
)
)
Альтернативой вашему исправленному коду является не проверка на пустое значение, а использование, 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!
)