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.
sumber
!
, gunakan^^^!
(lepas dua kali). Kalau tidak, fitur "ekspansi tertunda" akan memakannya.Perilaku yang sama juga terjadi ketika perintah berada pada satu baris (
&
adalah pemisah perintah):Penjelasan Joey adalah favorit saya. Namun perhatikan bahwa
enabledelayedexpansion
itu tidak berfungsi pada Windows NT 4.0 (dan saya tidak yakin tentang Windows 2000).Tentang pertanyaan tindak lanjut Anda, tidak, tidak mungkin untuk
EnableDelayedExpansion
tanpasetlocal
. Namun perilaku asli yang bertentangan dengan Anda dapat digunakan untuk mengatasi masalah kedua: triknya adalahendlocal
pada baris yang sama di mana Anda mengatur kembali nilai variabel yang Anda butuhkan.Ini
test.bat
modifikasi Anda :Tapi di sini ada solusi lain untuk masalah itu: gunakan prosedur dalam file yang sama alih-alih blok inline atau file eksternal.
sumber
Jika tidak berfungsi seperti itu, Anda kemungkinan telah menunda ekspansi variabel lingkungan. Anda dapat mematikannya dengan
cmd /V:OFF
atau menggunakan tanda seru di dalam if Anda:sumber
Ini terjadi karena baris Anda dengan
FOR
perintah hanya mengevaluasi sekali. Anda perlu beberapa cara untuk mengevaluasi kembali. Anda dapat mensimulasikan ekspansi yang tertunda denganCALL
perintah:sumber
Perlu dicatat bahwa itu TIDAK berfungsi jika itu adalah perintah tunggal pada baris yang sama.
misalnya
akan benar-benar diatur
FOO
ke 1. Anda kemudian dapat melakukan pemeriksaan lain seperti:Hei, aku tidak pernah bilang itu cantik. Tetapi jika Anda tidak ingin mengacaukan setlocal atau bisnis ekspansi yang tertunda, ini adalah solusi cepat.
sumber
Kadang-kadang, seperti yang saya miliki dalam kasus saya, ketika Anda harus kompatibel dengan sistem lama seperti server NT4 lama di mana ekspansi tertunda tidak berfungsi atau karena alasan tertentu tidak berfungsi, Anda mungkin perlu solusi alternatif.
Jika Anda akan menggunakan Delayd Expansion, disarankan juga agar setidaknya check-in batch harus disertakan:
Jika Anda hanya ingin pendekatan yang lebih mudah dibaca dan sederhana, berikut adalah solusi alternatif:
yang berfungsi seperti ini:
dan satu lagi solusi cmd murni:
kerjanya seperti ini:
dan ini penuh JIKA KEMUDIAN solusi sintaks LAIN:
kerjanya seperti ini:
sumber