Mam dwa przykłady bardzo prostych plików wsadowych:
Przypisywanie wartości do zmiennej:
@echo off
set FOO=1
echo FOO: %FOO%
pause
echo on
Co zgodnie z oczekiwaniami skutkuje:
FOO: 1
Press any key to continue . . .
Jeśli jednak umieszczę te same dwie linie w bloku IF NOT DEFINED:
@echo off
IF NOT DEFINED BAR (
set FOO=1
echo FOO: %FOO%
)
pause
echo on
Ten nieoczekiwanie skutkuje:
FOO:
Press any key to continue . . .
To nie powinno mieć nic wspólnego z IF, oczywiście blok jest wykonywany. Jeśli zdefiniuję BAR powyżej if, wyświetlony zostanie tylko tekst z polecenia PAUZA, zgodnie z oczekiwaniami.
Co daje?
Dalsze pytanie: Czy jest jakiś sposób, aby włączyć opóźnioną ekspansję bez setlocal?
Gdybym miał wywołać ten prosty przykładowy plik wsadowy z innego, przykład ustawia FOO, ale tylko LOKALNIE.
Na przykład:
testcaller.bat
@call test.bat
@echo FOO: %FOO%
@pause
test.bat
@setlocal EnableDelayedExpansion
@IF NOT DEFINED BAR (
@set FOO=1
@echo FOO: !FOO!
)
Wyświetla to:
FOO: 1
FOO:
Press any key to continue . . .
W tym przypadku wydaje się, że muszę włączyć opóźnione rozszerzenie w CALLER, co może być kłopotliwe.
!
, użyj^^^!
(dwa razy ucieknij). W przeciwnym razie funkcja „opóźnionego rozszerzenia” zje to.