Bir satır ayrıştırıldığında toplu iş dosyalarındaki ortam değişkenleri genişletilir. Parantezle (sizinkiyle) ayrılmış bloklarda if defined
, tüm blok bir "satır" veya komut olarak sayılır.
Bu,% FOO% ' nun tüm oluşumlarının blok çalıştırılmadan önceki değerleriyle değiştirildiği anlamına gelir . Durumunuzda hiçbir şey yok, çünkü değişken henüz bir değere sahip değil.
Bunu çözmek için gecikmeli genişlemeyi etkinleştirebilirsiniz :
setlocal enabledelayedexpansion
Gecikmeli genişleme !
, durumunuzda doğru davranışı sağlayacak olan ünlem işareti ( ) ile ayrıştırma yerine, ayrıştırma yerine yürütmede değerlendirilecek değişkenlere neden olur :
if not defined BAR (
set FOO=1
echo Foo: !FOO!
)
help set
bunu da detaylandır:
Son olarak, gecikmiş ortam değişken genişlemesi için destek eklenmiştir. Bu destek varsayılan olarak her zaman devre dışıdır, ancak /V
komut satırı düğmesi aracılığıyla etkinleştirilebilir / devre dışı bırakılabilir CMD.EXE
. GörmekCMD /?
Gecikmeli ortam değişkeni genişletmesi, bir metin satırı okunduğunda, yürütüldüğünde değil, gerçekleşen geçerli genişletme sınırlamalarını aşmak için kullanışlıdır. Aşağıdaki örnek, anında değişken genişlemeyle ilgili sorunu göstermektedir:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked
)
çünkü mesajı görüntüler asla %VAR%
içinde hem IF
birinci IF deyimi okunduğunda mantıksal gövdesini içerir ifadeleri, ikame edilir IF
bir birleşik deyimdir. Bu yüzden, bileşik ifadenin içindeki IF, asla "eşit" olmayacak olan "önce" ile "sonra" nı karşılaştırmaktadır. Benzer şekilde, aşağıdaki örnek beklendiği gibi çalışmayacak:
set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
ki bu olacak değil sadece ayarlar yerine geçerli dizinde dosyaların bir listesini oluşturmak, ancak LIST
bulunan en son dosyaya değişkeni. Yine, bunun nedeni,
ifadenin okunduğunda %LIST%
sadece bir kez genişletilmesi FOR
ve o zaman LIST
değişkenin boş olmasıdır. Yani yürüttüğümüz gerçek FOR döngüsü:
for %i in (*) do set LIST= %i
Bu sadece LIST
bulunan son dosyayı ayarlamaya devam ediyor .
Gecikmeli ortam değişkeni genişletme, yürütme sırasında ortam değişkenlerini genişletmek için farklı bir karakter (ünlem işareti) kullanmanızı sağlar. Gecikmeli değişken genişlemesi etkinse, yukarıdaki örnekler istenildiği şekilde çalışmak için aşağıdaki gibi yazılabilir:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)
set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%
!
, kullanın^^^!
(iki kez kaçış). Aksi takdirde "gecikmeli genleşme" özelliği onu yer.