Kaçış ve çift tırnak


96

-paramAşağıdaki komut satırındaki değerdeki tırnak işaretlerinden nasıl düzgün bir şekilde kaçabilirim ?

$cmd="\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'""
Invoke-Expression $cmd 

Bu elbette başarısız olur. Kaçış karakterini kullanarak tırnak işaretlerinden (tekli ve çiftli) kaçmaya çalıştım ve çeşitli kombinasyonlar yaptım, ancak hiçbir şey çalışmıyor.



@PeterMortensen bu makaleyle ilgili bir sorun var, yerel bir uygulama başlatmak ve argüman olarak çift tırnak içeren bir parametreyi iletmek istediğinizde daha iyi bir yol yok gibi görünüyor
Andrew Savinykh

@ Andrew Savinykh: Tek yönlü yerine cmd aracılığıyla başlatmaktır: $someCommandStringWithDoubleQuotes | cmd. Bu aslında PowerShell komut çalışır (örneğin çağıran CKağıt (çift tırnak gerektirir ki (aksi sessizce başarısız))). CMD'ye bir alternatif bash.exe'dir ( MinGW ) - ancak bazı durumlarda başlaması çok çok yavaş olabilir.
Peter Mortensen

Yanıtlar:


60

Bunun gibi parametrelerden kaçmak genellikle hayal kırıklığı kaynağıdır ve boşa geçen bir zaman gibi hissettirir. V2'de olduğunuzu görüyorum, bu yüzden Joel "Jaykul" Bennet'in bir süre önce blog yazdığı bir tekniği kullanmanızı öneririm. .

Uzun lafın kısası: dizinizi @ '...' @ ile sarmalamanız yeterli:

Start-Process \\server\toto.exe @'
-batch=B -param="sort1;parmtxt='Security ID=1234'"
'@

( Hangi alıntıların gerekli olduğunu ve hangi şeylerden kaçmaya çalıştığınızı varsaydığımı unutmayın.) Çıktıyla çalışmak istiyorsanız, -NoNewWindowanahtarı eklemek isteyebilirsiniz .

BTW: bu o kadar önemli bir sorundu ki, v3'ten beri --%PowerShell ayrıştırıcısının parametrelerinizle herhangi bir şey yapmasını durdurmak için kullanabilirsiniz :

\\server\toto.exe --% -batch=b -param="sort1;paramtxt='Security ID=1234'"

... orada iyi çalışmalı (aynı varsayımla).


Cevabınız için teşekkürler. başlama sürecini ne kadar denedim olursa olsun hep şikayet etti. SO cmd / C $ cmd yaptım (burada $ cmd, .exe dahil tüm komutumdur). Powershell 2.0 kullanıyorum. Doğru hatırlıyorsam buradaki ip bile işe yaramadı.
eetawil

3
Bu, çift tırnaklardan kaçmak için ters işaret (`) kullanmaya kıyasla gereksiz şekilde karmaşık görünüyor.
2014

6
Bu, beklediği kurallara uyduğunuz sürece harika çalışır. İlk @ '"1. satır" üzerinde olmalı, parametreniz "2. satırda" ve biten' @, "3. satırda" olmalıdır. '@ Sonundaki boşluktan önce boşluk olamaz. Dostum bu sözdizimi seçicidir!
Ian Newland

Harika çalışıyor! Dizenizdeki değişkenleri genişletmeniz gerekiyorsa, bunun yerine @"ve kullanabilirsiniz "@.
browly

100

Geri işaretini (`) kullanmak, aşağıdaki yerlere koyarsam benim için iyi çalışıyor:

$cmd="\\server\toto.exe -batch=B -param=`"sort1;parmtxt='Security ID=1234'`""

$cmd şu şekilde döner:

\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'"

Aradığınız şey bu muydu?

PowerShell'in bana verdiği hata beklenmedik bir 'sort1' belirtecine atıfta bulundu ve bu şekilde backticks nereye koyacağımı belirledim.

@ '...' @ sözdizimine "burada dize" denir ve tam olarak girileni döndürür. Değişkenleri aşağıdaki şekilde doldurmak için de kullanabilirsiniz:

$cmd=@'
"\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'""
'@

Açılış ve kapanış sembolleri yukarıda gösterildiği gibi kendi satırlarında olmalıdır.


Gecikme için özür dilerim ... bunu çalıştırma şeklim, sonunda powershell'den cmd / C "MYCOMMAND" ı aramak oldu. Doğrudan powershell kullanarak çalışmadı.
eetawil

1
Ancak Invoke-Expressionçift ​​tırnakları $cmdçağrıldığı zamandan çıkarmaz mı? Ya da kullanmadan nasıl $cmdkullandın Invoke-Expression?
Peter Mortensen

8

Bugün bir Node.js modülü aracılığıyla bir komut çalıştırmaya çalışırken kendimi benzer bir durumda buldum:

PowerShell'i kullanıyordum ve çalıştırmaya çalışıyordum:

command -e 'func($a)'

Ancak ekstra sembollerle, PowerShell argümanları karıştırıyordu. Düzeltmek için, çift tırnak işaretlerini geri işaretliyorum:

command -e `"func($a)`"

2
ilginç: "['`"][^'`"]['`"]"işe yarıyor… ama '[`'"][^`'"][`'"]'yaramıyor! beni deli ediyordu
David J

0

Powershell 5'te kaçan çift tırnak işaretleri ters işaret (`) ile yapılabilir. Ancak bazen, ters eğik çizgi + ters işaret (\ `) ile yapılabilen çift tırnaktan kaçmış olarak girmeniz gerekir. Örneğin bu curl görüşmesinde:

C:\Windows\System32\curl.exe -s -k -H "Content-Type: application/json" -XPOST localhost:9200/index_name/inded_type -d"{\`"velocity\`":3.14}"
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.