Peter Mortensen'in Codesmith'in cevabı hakkındaki yorumunda alıntı yaptığı 2. belge, işleri benim için çok daha net hale getirdi. Bu belge windowsinspired.com tarafından yazılmıştır. Bağlantı tekrarlandı: Windows Komut Satırı Bağımsız Değişkenlerinden Alıntı Yapmayı ve Çıkmayı Anlamanın Daha İyi Bir Yolu .
Daha fazla deneme ve yanılma aşağıdaki kılavuza götürür:
Her çift alıntıdan "
bir düzeltme işareti ile kaçın ^
. Windows komut kabuğu için özel anlamı olan diğer karakterler istiyorsanız (örneğin <
, >
, |
, &
) yerine, daha sonra da bir şapka ile kaçış düzenli karakterler olarak yorumlanmalıdır.
Programınızın foo komut satırı metnini almasını "a\"b c" > d
ve çıktısını out.txt dosyasına yönlendirmesini istiyorsanız , programınızı aşağıdaki gibi Windows komut kabuğundan başlatın:
foo ^"a\^"b c^" ^> d > out.txt
Eğer foo yorumlayıp \"
bir hazır çift alıntı olarak ve beklediği boşluk, ardından dahil sınırlandırmaktadır argümanları çift tırnak çıkışsız foo bir argüman belirterek olarak yorumlayan ve komutu a"b c
, bir argüman >
ve bir argüman d
.
Bunun yerine foo, çift ""
tırnaklı bir çift alıntıyı gerçek bir çift tırnak olarak yorumlarsa, programınızı şu şekilde başlatın:
foo ^"a^"^"b c^" ^> d > out.txt
Alıntılanan belgeden elde edilen temel fikir, Windows komut kabuğuna göre, çıkış karaktersiz çift tırnağın iki olası durum arasında geçişi tetiklemesidir.
Daha fazla deneme yanılma, ilk durumda, yeniden yönlendirmenin (bir dosyaya veya boruya) tanındığını ve bir düzeltme işaretinin ^
çift tırnaktan kaçtığını ve düzeltme işaretinin girişten kaldırıldığını gösterir. Diğer durumda, yeniden yönlendirme tanınmaz ve bir düzeltme işareti çift tırnaktan kaçmaz ve kaldırılmaz. Bu durumlara sırasıyla 'dış' ve 'iç' diyelim.
Komutunuzun çıktısını yeniden yönlendirmek istiyorsanız, komut kabuğunun yeniden yönlendirmeye ulaştığında dış durumda olması gerekir, bu nedenle yeniden yönlendirmeden önce çift sayıda çıkış karaktersiz (düzeltme işaretiyle) çift tırnak bulunmalıdır. foo "a\"b " > out.txt
olmaz iş - komut kabuğu bütününü geçer "a\"b " > out.txt
için foo yerine sadece geçme olarak, kombine komut satırı bağımsız değişkenleri olarak "a\"b "
ve çıkış yönlendirme out.txt .
foo "a\^"b " > out.txt
olmaz iş, ya şapka çünkü ^
o kadar sıradan bir karakter değil bir kaçış karakteri olduğu iç halde karşılaşıldığında "a\^"b " > out.txt
geçirilen alır foo .
Her zaman (umarız) çalışmasının tek yolu komut kabuğunu her zaman dış durumda tutmaktır, çünkü o zaman yeniden yönlendirme çalışır.
Yeniden yönlendirmeye (veya komut kabuğuna özel anlamı olan diğer karakterlere) ihtiyacınız yoksa, düzeltme işaretleri olmadan yapabilirsiniz. Eğer foo yorumlayıp \"
bir hazır çift alıntı gibi, o zaman demek de mümkün
foo "a\"b c"
Daha sonra foo"a\"b c"
, birleşik bağımsız değişkenler metni olarak alır ve bunu eşit tek bir bağımsız değişken olarak yorumlayabilir a"b c
.
Şimdi - nihayet - asıl soruya. myscript '"test"'
Windows komut kabuğu geçiş çağrılabilir '"test"'
için MyScript . Görünüşe göre myscript , tek ve çift tırnakları bağımsız değişken sınırlayıcıları olarak yorumlar ve kaldırır. Myscript'in neyi gerçek bir çift tırnak olarak kabul ettiğini bulmanız ve ardından bunu komutunuzda, ^
Windows komut kabuğunda özel anlamı olan herhangi bir karakterden kaçınmak için kullanarak belirtmeniz gerekir. Bunun myscript
Unix'te de mevcut olduğu göz önüne alındığında , belki de \"
hile yapıyor. Deneyin
myscript \^"test\^"
veya yeniden yönlendirmeye ihtiyacınız yoksa
myscript \"test\"
myscript \"test\"