Parametrede çift tırnaktan kaçış


109

Unix'te koşabilirdim myscript '"test"'ve alırdım "test".

Windows'ta cmdalıyorum 'test'.

Çift tırnak işaretlerini parametre olarak nasıl iletebilirim? Bunu bir cmdpencereden manuel olarak nasıl yapacağımı bilmek istiyorum, böylece programımı test etmek için bir program yazmam gerekmiyor.


2
Bir Windows makinesine dokunduğumun üzerinden yıllar geçti, ancak standart kaçış karakteri (ters eğik çizgi \) çalışmıyor mu? örn.myscript \"test\"
Gazler

Hayır! \ Test \ alıyorum. Bunun nedeni, pencerelerin / yerine ters eğik çizginin escaper olarak kullanılamamasıdır. Ama gerçekten bilmiyorum.
Bryan Tarla

Hangi Windows sürümünü kullandığınızı belirleyin, ancak \ "Windows 7'de (Ultimate) iyi çalışıyor. Bunu yapmanın başka bir yolu var, birden çok alıntıyla uğraşmak (yani" "" olur "veya başka bir şey), ancak yapamıyorum ne zaman ve nasıl çalıştığını öğrenin.
Kod Ustası

Yanıtlar:


22

Semptomları hızlı bir şekilde yeniden oluşturamıyorum: sadece veya hatta içeren myscript '"test"'bir toplu iş dosyasıyla myscript.batdenersem , tüm teklifleri alırım:@echo.%1@echo.%~1'"test"'

Belki kaçış karakteri deneyebilirsiniz ^böyle: myscript '^"test^"'?


3
O halde bu sorunun cevapları size daha fazla yardımcı olabilir mi?
mousio

2
Ha! Bunun bir wscriptsuç olduğunu asla tahmin edemezdim ! Windows'a bırakın :)
Bryan Field

4
Aslında ^ benim için işe yaramadı, ancak bu cevaba göre \ yaptı: stackoverflow.com/questions/2403647/…
kalenjordan

27
Windows: Globbing, shell genişletme ve parametre unescaping'in kabuk yerine çalıştırılan yürütülebilir dosya tarafından gerçekleştirildiği işletim sistemi. Çağrılan yürütülebilir dosyanın hangi konvansiyonu, varsa, onurunu asla bilemezsiniz.
binki

7
Değerli girdi: blogs.msdn.microsoft.com/twistylittlepassagesallalike/2011/04/… . İmleç gerçekten de tercih edilen kaçış karakteridir cmd.
Peter - Monica'yı eski

198

Bazı yerlerde kullanıldığını gördüğüm tırnak işaretlerinden kaçmanın bir başka yolu (muhtemelen tercih edilmese de), birden çok çift tırnak kullanmaktır . Başkalarının kodunu okunaklı hale getirmek amacıyla açıklayacağım.

İşte bir dizi temel kural:

  1. Çift tırnak gruplar sarılmış olup, boşluklar parametreleri ayrı:
    program param1 param2 param 3dört parametre geçecek program.exe:
         param1, param2, paramve 3.
  2. : Bir çift tırnaklı grup değeri ayırıcılar programlarına parametreleri geçirmeden olarak boşluk yok sayar
    program one two "three and more"üç parametreleri geçirir program.exe:
         one, two, ve three and more.
  3. Şimdi bazı karışıklıkları açıklamak için:
  4. Bir parametre haline katılmak çift tırnak sarılmış değil metne doğrudan bitişik görünen gruplar Çift alıntı:
    hello"to the entire"worldtek parametre olarak görür: helloto the entireworld.
  5. Not: Önceki kural, iki çift tırnaklı grubun doğrudan birbirine bitişik görünebileceğini İMZA ETMEZ.
  6. Bir kapanış teklifini doğrudan takip eden herhangi bir çift alıntı , çift tırnaklı gruba bitişik düz sarılmamış metin olarak (veya bunun bir parçası olarak) değerlendirilir, ancak yalnızca bir çift tırnak:
    "Tim says, ""Hi!"""tek bir parametre olarak işlev görür:Tim says, "Hi!"

Bu nedenle, üç farklı çift tırnak vardır: açılan tırnaklar, kapanan tırnaklar ve düz metin işlevi gören tırnaklar.
İşte o son kafa karıştırıcı satırın dökümü:

"çift tırnak grubunu aç
T içinde ""
"" lerin içindeyim
"" lerin içindeyim
    "" içinde - boşluk ayrılmıyor
"" s içinde
a iç "" ler
y içinde ""
"" s içinde
, içinde ""
    "" içinde - boşluk ayrılmıyor
"çift tırnaklı grubu kapat
"alıntı doğrudan daha yakından takip eder - düz, sarılmamış metin gibi davranır:"
"" Dışındaki H - önceki bitişik gruba katılır
"s dışındayım - ...
! "" dışında - ...
"çift tırnak grubunu aç
"çift tırnak grubunu kapat
"alıntı doğrudan daha yakından takip eder - düz, sarılmamış metin gibi davranır:"

Böylece, metin etkili bir şekilde dört karakter grubunu birleştirir (ancak biri hiçbir şey olmadan):
Tim says,  birincisi, boşluklardan kaçmak için
"Hi!sarılmış ikincisi, sarılmamış (boşluk yok)
 üçüncüsü, hiçbir şeyi sarmayan çift tırnaklı bir grup
"dördüncü, sarılmamış yakın alıntıdır.

Gördüğünüz gibi, çift tırnaklı grubun hiçbir şeyi sarmalamasına hala gerek yoktur, çünkü bu olmadan, aşağıdaki çift tırnak düz metin gibi davranmak yerine çift tırnaklı bir grubu açar.

Buradan, tırnak içinde ve dışında, üç çift tırnağın düz metin, çıkış karaktersiz çift tırnak işlevi gördüğü anlaşılmalıdır:

"Tim ona dedi," "" Son zamanlarda neler oluyor? "" ""

Tim said to him, "What's been happening lately?"beklendiği gibi yazdıracak . Bu nedenle, üç alıntı her zaman bir kaçış olarak güvenilir bir şekilde kullanılabilir.
Bununla birlikte, bunu anlarken, teknik olarak gereksiz başka bir boş çift tırnaklı grup eklediğinden sondaki dört tırnağın yalnızca ikiye indirilebileceğini not edebilirsiniz.

Kapatmak için işte birkaç örnek:

program ab REM (a) ve (b) gönderir
program "" "a" "" REM gönderir ("a")
program "" "a b" "" REM ("a) ve (b") gönderir
program "" "" Merhaba "" "Mike dedi." REM gönderir ("Merhaba," dedi Mike.)
program "" a "" b "" c "" d "" REM (abcd) gönderir çünkü "" gruplar hiçbir şeyi sarmaz
program "merhaba" "" alıntılar "" REM gönderiyor ("alıntılara" merhaba)
program "" "" merhaba dünya "" REM gönderiyor ("merhaba dünya")
program "" "merhaba" dünya "" REM gönderiyor ("merhaba dünya")
program "" "merhaba" dünya "" REM ("merhaba) ve (dünya") gönderiyor
program "merhaba" "dünya" "" KEP gönderiyor (merhaba "dünya")
program "merhaba" "" dünya "" REM gönderiyor (merhaba "dünya")

Son not: Bunların hiçbirini herhangi bir öğreticiden okumadım - hepsini deneyerek buldum. Bu nedenle açıklamam dahili olarak doğru olmayabilir. Bununla birlikte, yukarıdaki tüm örnekler verilmiş olarak değerlendirilir, bu nedenle teorimi doğrular (ama kanıtlamaz).

Bunu Windows 7, 64bit'te yalnızca parametre geçişli * .exe çağrıları kullanarak test ettim (* .bat değil, ancak aynı şekilde çalıştığını varsayıyorum).


11
+1, ancak bu davranışın uygulamaya bağlı olduğunu unutmayın. Windows'ta her uygulama kendi komut satırı parametrelerini ayrıştırır. Tanımladığınız davranışın Microsoft'un standart C kitaplığı olduğuna inanıyorum, ki bence diğer çoğu Windows C derleyicisi tarafından da kopyalanmaktadır.
Harry Johnston

3
Son örneğinizde birden fazla hata. program "" "ab" "" -> ("ab"), "merhaba" "" "tırnak" "-> (" tırnaklara merhaba) program "" "" merhaba dünya "" -> ("Merhaba) (dünya), program "" "merhaba" dünya "" -> ("merhaba) (dünya), program" "" merhaba "dünya" "-> (" merhaba dünya), program "merhaba" "" dünya "" - > (merhaba "dünya)
Thomson

46
... Söyleyebileceğim tek şey, Windows toplu iş dosyalarının sorunları olduğu. İsa aşkına, bu alıntılardan kaçmaktır; bir tür roket bilimi olmak zorunda olmamalı.
James Ko

4
@JamesKo Daha fazla katılamadım. Windows komut satırının esrarengiz saçmalığı ve tutarsızlığı beni asla kızdırmaz. Bu hurdayı kim tasarladı? Oh, yıllar geçtikçe boşa harcanan saatler! Unix çok kolay ve kıyaslandığında çok mantıklı.
Carlos A. Ibarra


24

Bunu dene:

myscript """test"""

Parametrede "" tek birine kaçış ".


1
Bu pek doğru değil. Deneyin myscript """test test"""ve çalışmaz (ilk parametre olarak verilir "test. Aslında, üç teklife ihtiyacınız var: myscript """"test test""Yine de sondaki üçüncü alıntı atlanabilir.
Ignitor

buradaki tüm tırnak işaretlerini kaldırmam ve parametre değerini bir seçme sorgu filtresinde kullanılan bir dizeye yerleştirmem gerekirse ne olur? Biri yardım edebilir mi?
SFDC_Learner

2
Belki bu soruya dikkat etmiyorsunuz, ancak bu, char **argvC başlatıcımdan spawnveya gibi işlevleri kullanarak başka bir işleme geçmem gerektiğinde bana yardımcı oldu exec. Teşekkür ederim. :-)
virgo47

2

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" > dve çı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.txtolmaz iş - komut kabuğu bütününü geçer "a\"b " > out.txtiç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.txtolmaz 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.txtgeç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 myscriptUnix'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\"

TEŞEKKÜR EDERİM! Kafamı duvara vuruyordum ve cmd komut metni cmd komut metnine yankılanan bir vbscript çalıştırmaya çalışıyordum - bunu miras aldım - ve alıntılardan kaçmanın bir yolunu bulamadım.
PopeDarren

0

Ben powershell'i cmd'den arıyorum ve tırnakları geçiyorum ve burada kaçış yok. Mezar aksanı, bu Win 10 yüzey profesyonelinde çift tırnaktan kaçmaya çalıştı.

>powershell.exe "echo la`"" >> test
>type test
la"

Aşağıda, diğer karakterlerin çift tırnaktan kaçması için aldığım çıktılar var:

la\
la^
la
la~

Bir alıntıdan kaçmak için başka bir alıntı kullanmak, hiçbir teklifle sonuçlanmaz. Gördüğünüz gibi, karakterlerin kendileri yazılmıştır, ancak çift tırnaktan kaçmadılar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.