Cómo introducir un comando multilínea


¿Es posible dividir una línea de comandos de PowerShell en varias líneas?

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

Author: Peter Mortensen, 2010-07-13

7 answers

Puedes usar el acento grave (o backtick):

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

Sin embargo, esto solo es necesario en los casos como se muestra arriba. Por lo general, se obtiene la continuación automática de la línea cuando un comando no puede ser sintácticamente completa en ese momento. Esto incluye iniciar un nuevo elemento de canalización:

Get-ChildItem |
  Select Name,Length

Funcionará sin problemas ya que después de | el comando no puede completarse ya que le falta otro elemento de canalización. También abrir llaves o cualquier otro tipo de paréntesis permitir continuación de línea directamente:

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

Similar a | una coma también funcionará en algunos contextos:

1,
2

Tenga en cuenta, sin embargo, similar a la Inserción automática de Punto y coma de JavaScript , hay algunas cosas que se rompen de manera similar porque el salto de línea ocurre en un punto donde está precedido por una instrucción válida:

return
  5

No funcionará.

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

'Foo
bar'

Entonces incluyen los saltos de línea dentro de la cadena.

 447
Author: Joey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-10 11:13:35

Acaba de descubrir que no debe haber ningún carácter entre la marca de retroceso y el salto de línea, incluso los espacios en blanco harán que el comando no funcione.

 50
Author: Neffets,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-06 12:55:51

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

El analizador sintáctico de PowerShell reconoce cuando una instrucción claramente no está completa, y mira a la siguiente línea. Por ejemplo, imagine 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á: el analizador verá dos sentencias. El primero es Get-Foo y el segundo es un bloque de guión. En su lugar, escribo:

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

Podría usar el carácter de continuación de línea ( ` ), pero eso hace que el código sea difícil de leer e invita a errores.

Debido a que este caso requiere que la llave abierta esté en la línea anterior, sigo ese patrón en todas partes:

    if (condition) {
        .....
    }

Tenga en cuenta que las sentencias if requieren un bloque de script en la gramática del idioma, por lo que el analizador buscará en la siguiente línea el bloque de script, pero para la consistencia, mantengo el corchete abierto en el mismo alinear.

Simlarly, en el caso de tuberías largas, me rompo después del carácter de tubería(|):

    $project.Items | 
        ? { $_.Key -eq "ProjectFile" } | 
        % { $_.Value } | 
        % { $_.EvaluatedInclude } |
        % {
            .........
        }
 32
Author: Jay Bazuzi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-21 20:02:42

Para ampliar la respuesta de cristobalito :

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

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

Por Ejemplo:

Firme un script de powershell 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}
 26
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-15 08:32:39

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

 9
Author: Bad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-03 15:11:24

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

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

 1
Author: cristobalito,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-13 09:42:54

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

$header =    "Make," +

             "ComputerName," +

             "Model," +

             "Windows Version"

Se verá igual que:

$header = "Make,ComputerName,Model,Windows Version"
 0
Author: Steve Fellwock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-16 19:14:32