Saya punya dua contoh file batch yang sangat sederhana:
Menetapkan nilai ke variabel:
@echo off
set FOO=1
echo FOO: %FOO%
pause
echo on
Yang, seperti yang diharapkan, menghasilkan:
FOO: 1
Press any key to continue . . .
Namun, jika saya menempatkan dua baris yang sama di dalam blok JIKA TIDAK DITETAPKAN:
@echo off
IF NOT DEFINED BAR (
set FOO=1
echo FOO: %FOO%
)
pause
echo on
Ini secara tak terduga menghasilkan:
FOO:
Press any key to continue . . .
Ini seharusnya tidak ada hubungannya dengan IF, jelas blok sedang dieksekusi. Jika saya mendefinisikan BAR di atas if, hanya teks dari perintah PAUSE yang ditampilkan, seperti yang diharapkan.
Apa yang menyebabkannya?
Pertanyaan tindak lanjut: Apakah ada cara untuk memungkinkan ekspansi yang tertunda tanpa setlocal?
Jika saya akan memanggil file batch contoh sederhana ini dari dalam yang lain, contoh menetapkan FOO, tetapi hanya LOCALLY.
Sebagai contoh:
testcaller.bat
@call test.bat
@echo FOO: %FOO%
@pause
test.bat
@setlocal EnableDelayedExpansion
@IF NOT DEFINED BAR (
@set FOO=1
@echo FOO: !FOO!
)
Ini menampilkan:
FOO: 1
FOO:
Press any key to continue . . .
Dalam hal ini, tampaknya saya harus mengaktifkan ekspansi yang tertunda di CALLER, yang mungkin merepotkan.
!
, gunakan^^^!
(lepas dua kali). Kalau tidak, fitur "ekspansi tertunda" akan memakannya.