2010-07-13 23 views
263

¿Es posible dividir una línea de comandos Powershell en varias líneas?¿Cómo ingresar un comando de varias líneas?

En Visual Basic, puedo usar el guión bajo (_) para continuar el comando en la siguiente línea.

+3

La pregunta "¿por qué no las barras invertidas" está cubierto muy bien en _PowerShell de Bruce Payette en el Action_; gran libro. Bruce tiene un amplio conocimiento de la historia de los lenguajes de programación. Esperando la V2 de este libro. –

+3

Duplicado de ... http://stackoverflow.com/questions/2608144/how-to-split-long-commands-over-multiple-lines-in-powershell – SteveC

+1

Lo sentimos si es oftálmico pero si debe enviar el script con comando 'sh', las convenciones bash se mantienen así puedes usar la barra invertida. En ese caso, su script también debería tener terminaciones de estilo Unix. –

Respuesta

390

se puede utilizar el acento grave (o tilde):

Get-ChildItem -Recurse ` 
    -Filter *.jpg ` 
    | Select LastWriteTime 

Sin embargo, esto sólo es siempre necesaria en estos casos como se muestra arriba. Por lo general, se obtiene la continuación de línea automática cuando un comando no puede completarse sintácticamente en ese punto. Esto incluye iniciar un nuevo elemento de conducción:

Get-ChildItem | 
    Select Name,Length 

funcionará sin problemas, ya que después de la | el comando no puede ser completa ya que le falta otro elemento tubería. También la apertura de llaves o cualquier otro tipo de paréntesis, permitirá a continuación de línea directa:

$x=1..5 
$x[ 
    0,3 
] | % { 
    "Number: $_" 
} 

similares a la | una coma también trabajará en algunos contextos:

1, 
2 

Tenga en cuenta, sin embargo, de forma similar a JavaScript de Automatic Semicolon Insertion, hay algunas cosas que se rompen de manera similar debido a que el salto de línea se produce en un punto en el que es precedida por una declaración válida:

return 
    5 

no funcionará.

Por último, las cadenas (en todas las variedades) también pueden extenderse más allá de una sola línea:

'Foo 
bar' 

Incluyen los saltos de línea dentro de la cadena, a continuación.

+3

Y no olvide mencionar que algunos otros tokens también actúan como continuadores de línea, p. '|' y '{'. –

+1

@Keith: Gracias, lo incluí. Probablemente eran demasiado obvios para mencionarlos ;-) – Joey

+9

Nah, es bueno tener estos otros caracteres documentados para referencia futura. –

1

Supongo que está hablando en la línea de comandos; si está en un script, entonces una nueva línea actúa como un delimitador de comandos.

En la línea de comando, use un punto y coma ';'

28

En la mayoría de los lenguajes tipo C, soy consciente de colocar mis llaves donde creo que hacen que el código sea más fácil de leer.

El analizador de PowerShell reconoce cuando una declaración claramente no está completa, y mira a la siguiente línea. Por ejemplo, imagina un cmdlet que toma un parámetro de bloque de script opcional:

 
    Get-Foo { ............ } 

si el bloque de script es muy largo, es posible que desee escribir:

 
    Get-Foo 
    { 
     ............... 
     ............... 
     ............... 
    } 

Pero esto no funcionará: la analizador verá dos declaraciones. El primero es Get-Foo y el segundo es un bloque de script. En su lugar, escribo:

 
    Get-Foo { 
     ............... 
     ............... 
     ............... 
    } 

que podría utilizar el carácter de continuación de línea (`), pero eso hace que para el código difícil de leer, e invita a los insectos.

Debido a que este caso requiere la llave abierta para estar en la línea anterior, seguir a ese patrón en todas partes:

 
    if (condition) { 
     ..... 
    } 

Tenga en cuenta que if declaraciones requieren un bloque de script en la gramática del lenguaje, por lo que el analizador sintáctico mire en la siguiente línea para el bloque de script, pero para mantener la coherencia, mantengo el corchete abierto en la misma línea.

simlarly, en el caso de tuberías de gran longitud, que rompen después del carácter de barra vertical (|):

 
    $project.Items | 
     ? { $_.Key -eq "ProjectFile" } | 
     % { $_.Value } | 
     % { $_.EvaluatedInclude } | 
     % { 
      ......... 
     } 
+0

¿cómo funcionan 'if' y' foreach' y 'try'? permiten secuencias de comandos en la línea siguiente ... esto significa que es posible – Nacht

+0

@Nacht: De memoria oxidada: las declaraciones que requieren un bloque de secuencia de comandos, según la gramática del lenguaje, analizarán más allá de una nueva línea para encontrar una. ¿Alguien puede confirmar? –

+0

umm .... ¿eso no contradice su publicación? - "Pero esto no funcionará" – Nacht

21

Asumo que estás hablando en la línea de comandos - si es en una secuencia de comandos , entonces una nueva línea actúa como un delimitador de comando.

En la línea de comandos, use un punto y coma ;, por ejemplo; signate a powershell-script en la línea de comandos sin saltos de línea.

powershell -Command "&{$cert=Get-ChildItem –Path cert:\CurrentUser\my -codeSigningCert ; Set-AuthenticodeSignature -filepath Z:\test.ps1 -Cert $cert} 
+8

No es la respuesta a la pregunta, pero su respuesta respondió mi pregunta. :) – Frederik

+1

Eso es interesante, pero es lo contrario de lo que OP estaba preguntando. OP quería dividir un solo comando en varias líneas; Usted explicó cómo combinar varios comandos en una línea. –

41

acabo de enterar que no debe haber ningún carácter entre la garrapata hacia atrás y el salto de línea, incluso los espacios en blanco hará que el comando no funcione.

+5

Si bien esto técnicamente no es la respuesta a la pregunta, +1 porque esto es absolutamente esencial. Me acabo de enterar por el camino difícil, y seguramente evitaré el back-tick en el desarrollo futuro siempre que sea posible. –

+2

Por lo tanto, esencialmente no hay una forma sólida de romper una larga línea en Powershell. No es de extrañar que tienda a ver esos [scripts de PowerShell de 2 pantallas en pantalla] (http://stackoverflow.com/questions/2608144/how-to-split-long-commands-over-multiple-lines-in-powershell) cada dónde. #ShakeMyHead – RayLuo

+0

Tuve problemas con esto, también ... puede insertar un comentario en línea antes de la marca de retroceso para incluir un comentario, como este: Algún comando ' -arg1 <# explain arg 1 #>' -arg2 <# explain arg 2 #> – joelsand

6

En PowerShell y PowerShell ISE, también es posible usar SHIFT+ENTER al final de cada línea para la edición de líneas múltiples (en lugar del estándar `).

+1

Este es un gran consejo para editar cadenas de varias líneas aquí, que de lo contrario son horribles de editar si no conoce el truco 'SHIFT-ENTER'. – dpw

+1

Creo que este es el caso en la versión de consola de PowerShell solo cuando se usa el módulo 'PSReadLine' o un equivalente. En las funciones de entrada de la consola estándar de Windows, 'Enter' y 'Shift + Enter' son funcionalmente equivalentes. –

+0

@Bill_Stewart cierto, funciona en la consola ISE sin PSReadline, pero no en el host de la consola. – briantist

0

Si está tratando de separar cadenas en múltiples líneas, puede usar el "+". Por ejemplo:

$header = "Make," + 

      "ComputerName," + 

      "Model," + 

      "Windows Version" 

mirará al igual que:

$header = "Make,ComputerName,Model,Windows Version" 
Cuestiones relacionadas