У мене є два приклади дуже простих пакетних файлів:
Призначення значення змінній:
@echo off
set FOO=1
echo FOO: %FOO%
pause
echo on
Що, як очікується, призводить до:
FOO: 1
Press any key to continue . . .
Однак якщо я розміщую ці ж два рядки всередині блоку, ЯКЩО НЕ ВИЗНАЧЕНО:
@echo off
IF NOT DEFINED BAR (
set FOO=1
echo FOO: %FOO%
)
pause
echo on
Це несподівано призводить до:
FOO:
Press any key to continue . . .
Це не повинно мати нічого спільного з ІФ, очевидно, що блок виконується. Якщо я задаю BAR вище значення if, відображається лише текст команди PAUSE, як очікувалося.
Що дає?
Подальше запитання: Чи є спосіб увімкнути затримку розширення без встановлення місцевих?
Якби я назвав цей простий прикладний пакетний файл з іншого, приклад встановлює FOO, але тільки МІСКО.
Наприклад:
testcaller.bat
@call test.bat
@echo FOO: %FOO%
@pause
test.bat
@setlocal EnableDelayedExpansion
@IF NOT DEFINED BAR (
@set FOO=1
@echo FOO: !FOO!
)
Тут відображаються:
FOO: 1
FOO:
Press any key to continue . . .
У цьому випадку виявляється, що я повинен увімкнути затримку розширення в CALLER, що може бути клопотом.
!
, скористайтеся^^^!
(уникнути цього двічі). Інакше функція "затримки розширення" з'їсть її.