Kısa cevap - köşeli parantez kullanın:
if [%1]==[] goto :blank
veya (alıntılanan bağımsız değişkenleri işlemeniz gerektiğinde, aşağıdaki Düzenleme'ye bakın):
if [%~1]==[] goto :blank
Neden? sorabilirsin. Tam da Jeremiah Willcock'un bahsettiği gibi: http://ss64.com/nt/if.html - bunu kullanıyorlar! Tamam, ama alıntıların nesi var?
Yine, kısa cevap: "sihirli" - bazen çift (çift) tırnaklar tek (çift) tırnağa dönüştürülür. Ve başlangıç için eşleşmeleri gerekiyor.
Şu küçük senaryoyu düşünün:
@rem argq.bat
@echo off
:loop
if "%1"=="" goto :done
echo %1
shift
goto :loop
:done
echo Done.
Hadi test edelim:
C:\> argq bla bla
bla
bla
Done.
Çalışıyor gibi görünüyor. Ama şimdi ikinci vitese geçelim:
C:\> argq "bla bla"
bla""=="" was unexpected at this time.
Boom Bu doğru olarak değerlendirilmedi, yanlış olarak da değerlendirilmedi. Senaryo ÖLÜLDÜ. Reaktörü hattın aşağısında bir yerde kapatmanız gerekiyorsa, iyi şanslar. Artık Harry Daghlian gibi öleceksin.
Düşünebilirsiniz - Tamam, argümanlar tırnak içeremez. Yaparlarsa, bu olur. Yanlış İşte biraz teselli:
C:\> argq ""bla bla""
""bla
bla""
Done.
Ah evet. Endişelenmeyin - bazen bu işe yarayacaktır.
Başka bir komut dosyası deneyelim:
@rem args.bat
@echo off
:loop
if [%1]==[] goto :done
echo %1
shift
goto :loop
:done
echo Done.
Yukarıdaki durumlarda iyi çalıştığını kendiniz test edebilirsiniz. Bu mantıklı - alıntıların parantezlerle hiçbir ilgisi yok, bu yüzden burada sihir yok. Peki ya değiştirgeleri parantezlerle süslemeye ne dersiniz?
D:\>args ]bla bla[
]bla
bla[
Done.
D:\>args [bla bla]
[bla
bla]
Done.
Orada şans yok. Parantezler, cmd.exe
'ın ayrıştırıcısını boğamaz.
Bir an için kötü sözlere geri dönelim. Tartışma bir alıntıyla sona erdiğinde sorun oradaydı:
D:\>argq "bla1 bla2"
bla2""=="" was unexpected at this time.
Ya ben geçersem:
D:\>argq bla2"
The syntax of the command is incorrect.
Komut dosyası hiç çalışmayacak. Aynı args.bat
:
D:\>args bla2"
The syntax of the command is incorrect.
Ama "
böyle bir durumda -karakterlerin sayısı "eşleştiğinde" (yani - çift olduğunda) ne elde ederim :
D:\>args bla2" "bla3
bla2" "bla3
Done.
GÜZEL - .bat
Dosyaların komut satırı argümanlarını nasıl böldüğü hakkında bir şeyler öğrenmişsinizdir umarım (İPUCU: * Bu tam olarak bash'daki gibi değildir). Yukarıdaki argüman bir boşluk içerir. Ancak alıntılar otomatik olarak silinmez.
Ve argq? Buna nasıl tepki veriyor? Tahmin edilebileceği gibi:
D:\>argq bla2" "bla3
"bla3"=="" was unexpected at this time.
Öyleyse - şunu söylemeden önce düşünün: "Ne olduğunu biliyor musunuz? Sadece alıntı kullanın. [Çünkü bana göre bu daha güzel görünüyor]".
Düzenle
Son zamanlarda, bu yanıtla ilgili yorumlar yapıldı - yani, köşeli parantezler, alıntılanan argümanları "aktaramaz" ve onlara alıntı yapılmamış gibi davranır.
Sözdizimi:
if "%~1"=="" (...)
Çift tırnaklar için yeni bulunan bir erdem değil, ilk ve son karakter bir çift tırnak ise, bağımsız değişken değişkeninden tırnakları çıkarmanın düzgün bir özelliğinin göstergesidir.
Bu "teknoloji", köşeli parantezlerle de aynı şekilde çalışır:
if [%~1]==[] (...)
Bunu belirtmek faydalı bir şeydi, bu yüzden yeni yanıta da olumlu oy verdim.
Son olarak, çift alıntı hayranları, ""
kitabınızda formun bir argümanı var mı yoksa boş mu? Sadece soruyorum' ;)
GOTO BLANK
Diğer ikiIF
ifadeye köşeli parantez ( satırdaki gibi) eklerseniz , bu sorunu çözer mi?