2012-01-18 11 views
11

Qualcuno può spiegare questo risultato? Ho sprecato un sacco di tempo nel corso degli anni cercando di padroneggiare la sintassi di PowerShell per chiamare i comandi, ma questo ... Non riesco nemmeno a indovinare come ottenere questo risultato dall'input.Operatore di chiamata di PowerShell (&) sintassi e doppi apici

PS C:\Users\P> & echoargs " ""1"" 2 3 ""4 5 6"" 7 8 9" 
Arg 0 is < 1 2 3 4> 
Arg 1 is <5> 
Arg 2 is <6 7 8 9> 

Bueller?

+0

È questo l'echoarg che si sta utilizzando? http://weblogs.asp.net/jgalloway/archive/2006/01/27/436713.aspx – ravikanth

+0

Vedi la risposta di Keith. La scorsa settimana ho installato il "public drop" di PSCX. Penso che lo abbia aggiornato da allora. –

+0

Buona domanda a proposito. Mostra i capricci del passaggio di argomenti di Powershell. Ma non si tratta veramente di '&' come vedi lo stesso quando chiami semplicemente echoargs. – manojlds

risposta

4

Le virgolette doppie raddoppiate all'interno di una stringa con virgolette doppie rappresentano un modo per inserire una virgoletta doppia. La versione aggiornata di echoargs.exe mostra questo un po 'più chiaramente come vi mostra la riga di comando utilizzato per richiamare l'exe:

PS> echoargs " ""1"" 2 3 ""4 5 6"" 7 8 9" 
Arg 0 is < 1 2 3 4> 
Arg 1 is <5> 
Arg 2 is <6 7 8 9> 

Command line: 
"C:\...\Modules\Pscx\Apps\EchoArgs.exe" " "1" 2 3 "4 5 6" 7 8 9" 

Se si prende questa linea di comando (dopo che è stato analizzato da PowerShell) si ottiene lo stesso risultato in CMD.exe:

CMD> EchoArgs.exe " "1" 2 3 "4 5 6" 7 8 9" 
Arg 0 is < 1 2 3 4> 
Arg 1 is <5> 
Arg 2 is <6 7 8 9> 

Command line: 
C:\...\Modules\Pscx\Apps\EchoArgs.exe " "1" 2 3 "4 5 6" 7 8 9" 

quanto al motivo per .NET o C++ codice di avvio analizza la riga di comando in questo modo, io non sono del tutto sicuro. Questo MSDN topic lo copre un po 'e se guardi gli esempi in fondo all'argomento, vedrai un comportamento parsing altrettanto strano ad es. a\\\b d"e f"g h fornisce a\\\b, de fg e h.

2

Nota che PowerShell è noto per alcuni bug pesanti quando si tratta di passare gli argomenti alle applicazioni e citando i suddetti argomenti - http://connect.microsoft.com/PowerShell/feedback/details/376207/executing-commands-which-require-quotes-and-variables-is-practically-impossible

Ecco come ho capito come viene (MIS) analizzato:

La stringa è " ""1"" 2 3 ""4 5 6"" 7 8 9"

A causa del bug le doppie virgolette doppie, che diventano letteralmente doppie virgolette, non lo rendono mai.

La stringa sarebbe come " '1' 2 3 '4 5 6' 7 8 9"

Così <space>1 2 3 4 diventa un argomento perché la prima sezione con apici corrispondenti e 4 si verifica prima posizione successiva. Quindi lo spazio, e quindi 5 diventa il secondo argomento. Quindi spazio, quindi la parte successiva sarà un argomento separato. Ancora una volta, la stessa regola del primo argomento, tranne che 6 si verifica prima della citazione e senza uno spazio e quindi 6 7 8 9 diventa l'argomento successivo.

Bottomline - L'argomento PowerShell che passa a applicazioni esterne è piuttosto incasinato.

+2

V3 migliora la chiamata di EXE con argomenti complessi, vedere questo post del blog: http://rkeithhill.wordpress.com/2012/01/02/powershell-v3-ctp2-provides-better-argument-passing-to-exes/ –

Problemi correlati