2013-08-08 19 views
50

Sono abbastanza nuovo di Powershell ... e mi chiedevo come fuggire correttamente le virgolette nel valore -param.Escaping citazioni e virgolette

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

Questo ovviamente non funziona, ho cercato di sfuggire le virgolette (singole e doppie) utilizzando il carattere di escape `e fatto varie combinazioni, ma niente sta funzionando. Please Help

risposta

35

I parametri di escape di questo tipo sono di solito fonte di frustrazione e si sentono molto come un tempo sprecato. Vedo che sei sulla v2 così Io suggerirei di usare una tecnica che Joel "Jaykul" Bennet blogged about a while ago

farla breve: basta avvolgere si stringa con @ '...' @:

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

(mi preme che io abbia assunto quali citazioni sono necessarie e quali cose stavi tentando di scappare) Se vuoi lavorare con l'output, potresti voler aggiungere l'opzione -NoNewWindow.

BTW: questo è stato tema così importante che da quando v3 è possibile utilizzare --% per fermare PowerShell parser dal fare qualsiasi cosa con i parametri:

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

... dovrebbe funzionare bene lì (con la stessa ipotesi).

+0

Grazie per la risposta. avvio-processo non importa quanto mi abbia sempre lamentato. COSÌ ho fatto cmd/C $ cmd (dove $ cmd è il mio intero comando incluso .exe.). Sto usando PowerShell 2.0. Anche la stringa qui non ha funzionato se non ricordo male. – eetawil

+0

Questo sembra inutilmente complicato rispetto all'utilizzo di backtick (') per evitare le virgolette doppie. – saille

+4

Questo funziona benissimo se si seguono le regole che si aspetta. Il primo @ 'deve essere su "linea 1", il parametro deve essere su "riga 2" e il finale' @ deve su "riga 3". La desinenza '@ non può avere spazi prima di essa. Man questa sintassi è schizzinosa! –

47

Utilizzando l'apice inverso (`) funziona bene per me, se li ho messi nei seguenti luoghi:

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

$cmd ritorna come:

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

E 'questo quello che cercavi?

L'errore Powershell mi ha indicato un token imprevisto 'sort1', è così che ho determinato dove inserire i backtick.

La sintassi @ '...' @ è chiamata "stringa qui" e restituirà esattamente ciò che viene inserito. È inoltre possibile utilizzare per popolare le variabili nel modo seguente: i simboli

[email protected]' 
"\\server\toto.exe -batch=B -param="sort1;parmtxt='Security ID=1234'"" 
'@ 

l'apertura e chiusura devono essere sulla propria linea come illustrato sopra.

+0

Ci scusiamo per il ritardo ... il modo in cui ho funzionato è di chiamare finalmente cmd/C "MYCOMMAND" da PowerShell. Non ha funzionato direttamente con PowerShell. – eetawil

6

mi sono trovato in una situazione simile oggi durante il tentativo di eseguire un comando tramite un modulo nodejs:

stavo usando il PowerShell e cercando di eseguire:

command -e 'func($a)' 

Ma con i simboli aggiuntivi, PowerShell stava manipolando gli argomenti. Per correggere, ho fatto il segno di spunta tra virgolette doppie con escape:

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

Spero che questo aiuti qualcuno.

+0

interessante: '' '" [''"] [^' '"] [''"] "' '' funziona ... ma '' '' [] '"] [^ ''"] [''"] ''' 'no! mi stava facendo impazzire –

Problemi correlati