2012-01-18 12 views
11

¿Alguien me puede explicar este resultado? He desperdiciado mucho tiempo tratando de dominar la sintaxis de PowerShell para llamar comandos, pero esto ... No puedo ni adivinar cómo obtener este resultado de la entrada.Operador de llamadas de PowerShell (&) sintaxis y comillas dobles

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

¿Este es el ecoargs que está utilizando? http://weblogs.asp.net/jgalloway/archive/2006/01/27/436713.aspx – ravikanth

+0

Vea la respuesta de Keith. Instalé la "publicación pública" de PSCX la semana pasada. Creo que lo ha actualizado desde entonces. –

+0

Buena pregunta por cierto. Muestra los caprichos del argumento de Powershell pasando. Pero en realidad no se trata de '&' ya que ves lo mismo cuando llamas a echoargs. – manojlds

Respuesta

4

Las comillas de dobles dobladas dentro de una secuencia de comillas dobles es una forma de insertar una comilla doble. La versión actualizada de echoargs.exe muestra esto un poco más claro, ya que le muestra la línea de comandos que se utiliza para invocar el 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" 

Si se toma esa línea de comandos (después de que ha sido analizado por PowerShell) se obtiene el mismo resultado en 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" 

cuanto a por qué el .NET o C++ código de inicio analiza la línea de comandos de esa manera, no estoy del todo seguro. Este MSDN topic lo cubre un poco y si observa los ejemplos al final del tema, verá un comportamiento de análisis igualmente extraño, p. a\\\b d"e f"g h da a\\\b, de fg y h.

2

Tenga en cuenta que Powershell es conocido por algunos errores pesados ​​cuando se trata de pasar argumentos a las aplicaciones y citando dichos argumentos - http://connect.microsoft.com/PowerShell/feedback/details/376207/executing-commands-which-require-quotes-and-variables-is-practically-impossible

Ésta es la forma en que entiendo cómo se está (mal) analiza:

La cadena es " ""1"" 2 3 ""4 5 6"" 7 8 9"

Debido a la falla, las dobles comillas dobles, que se convierten en citas dobles literales, nunca lo hacen.

La cadena sería como " '1' 2 de 3 '4 5 6' 7 8 9"

Así <space>1 2 3 4 se convierte en un argumento porque la primera sección con citas a juego y 4 se produce antes de que el siguiente espacio. Luego espacio, y por lo tanto 5 se convierte en segundo argumento. Luego espacio, entonces la siguiente parte será un argumento separado. Aquí nuevamente, la misma regla que el primer argumento, excepto que 6 ocurre antes de la cita y sin espacio y, por lo tanto, 6 7 8 9 se convierte en el siguiente argumento.

Conclusión: el argumento de Powershell que pasa a aplicaciones externas está bastante desordenado.

+2

V3 mejora la invocación de EXEs con argumentos complejos, consulte esta publicación en el blog: http://rkeithhill.wordpress.com/2012/01/02/powershell-v3-ctp2-provides-better-argument-passing-to-exes/ –

Cuestiones relacionadas