630 votes

Comment entrer une commande de plusieurs lignes

Est-il possible de répartir une ligne de commande PowerShell sur plusieurs lignes ?

En Visual Basic, je peux utiliser le trait de soulignement ( _ ) pour poursuivre la commande sur la ligne suivante.

4 votes

La question "pourquoi pas des antislashes" est bien traitée dans l'article de Bruce Payette intitulé PowerShell en action ; grand livre. Bruce a une grande connaissance de l'histoire des langages de programmation. J'attends avec impatience la V2 de ce livre.

4 votes

2 votes

Désolé si c'est hors sujet mais si vous devez soumettre le script avec sh les conventions bash tiennent, vous pouvez donc utiliser les backslash. Dans ce cas, votre script devrait également avoir des terminaisons de style unix.

884voto

Joey Points 148544

Vous pouvez utiliser un espace suivi de l'accent grave (backtick) :

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

Toutefois, cela n'est jamais nécessaire que dans les cas indiqués ci-dessus. Habituellement, vous obtenez une continuation de ligne automatique lorsqu'une commande ne peut pas être syntaxiquement complète à ce point. Cela inclut le démarrage d'un nouvel élément de pipeline :

Get-ChildItem |
  Select Name,Length

fonctionnera sans problème puisqu'après le | la commande ne peut pas être complète puisqu'il lui manque un autre élément de pipeline. De même, l'ouverture d'accolades ou de tout autre type de parenthèses permet de poursuivre la ligne directement :

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

Semblable à la | une virgule fonctionnera également dans certains contextes :

1,
2

Gardez à l'esprit, cependant, qu'à l'instar de l'outil JavaScript Insertion automatique du point-virgule il y a des choses qui sont cassées de la même façon parce que le saut de ligne se produit à un endroit où il y a un risque d'erreur. est précédé d'une déclaration valable :

return
  5

ne fonctionnera pas.

Enfin, les chaînes de caractères (dans toutes les variétés) peuvent également s'étendre au-delà d'une seule ligne :

'Foo
bar'

Ils incluent donc les sauts de ligne à l'intérieur de la chaîne.

8 votes

Et n'oubliez pas de mentionner que d'autres jetons agissent également comme des continuateurs de ligne, par ex. | et { .

1 votes

@Keith : Merci, je l'ai inclus. Ceux-là étaient probablement trop évidents pour être mentionnés ;-)

23 votes

Nan, c'est bien d'avoir ces autres personnages documentés pour une référence future.

109voto

Neffets Points 33

Je viens de découvrir qu'il ne doit pas y avoir tout entre la coche arrière et le saut de ligne. Même un espace blanc empêchera la commande de fonctionner.

15 votes

Bien que ce ne soit pas techniquement la réponse à la question, +1 parce que c'est absolument essentiel. Je viens de le découvrir à la dure, et je vais sûrement éviter le back-tick dans les développements futurs, dans la mesure du possible.

4 votes

Il n'existe donc pas de moyen robuste de rompre une longue ligne dans Powershell. Pas étonnant que j'aie tendance à voir ces Scripts powershell sur 2 écrans partout. #ShakeMyHead

2 votes

Je me débattais avec ça aussi... vous pouvez insérer un commentaire en ligne avant le back-tick pour inclure un commentaire, comme ceci : Some-Command ` -arg1 <# explain arg 1 #> ` -arg2 <# explain arg 2 #>

44voto

Jay Bazuzi Points 20462

Dans la plupart des langages de type C, je place délibérément mes accolades là où je pense qu'elles rendent le code plus facile à lire.

L'analyseur syntaxique de PowerShell reconnaît lorsqu'une déclaration est manifestement incomplète et passe à la ligne suivante. Par exemple, imaginez un cmdlet qui prend un paramètre de bloc optionnel script :

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

si le bloc script est très long, vous pourriez vouloir écrire :

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

Mais cela ne fonctionnera pas : l'analyseur verra deux déclarations. La première est Get-Foo et le second est un bloc script. A la place, j'écris :

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

Je pourrais utiliser le caractère de fin de ligne (`), mais cela rend le code difficile à lire et favorise les bogues.

Comme ce cas exige que l'accolade ouverte soit sur la ligne précédente, je suis ce modèle partout :

    if (condition) {
        .....
    }

Notez que if nécessitent un bloc script dans la grammaire du langage, donc l'analyseur syntaxique cherchera le bloc script sur la ligne suivante, mais pour des raisons de cohérence, je garde l'accolade ouverte sur la même ligne.

De même, dans le cas de longues canalisations, je casse après le caractère pipe ( | ) :

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

0 votes

Comment if et foreach et try fonctionne alors ? ils autorisent les blocs script sur la ligne suivante... cela signifie que cela doit être possible

0 votes

@Nacht : De mémoire rouillée : les déclarations qui nécessitent un bloc script, par la grammaire du langage, analyseront au-delà d'une nouvelle ligne pour en trouver une. Quelqu'un peut-il confirmer ?

2 votes

@Nacht : "Mais cela ne fonctionnera pas" faisait référence aux situations où les autres paramètres sont facultatifs, ce qui est le cas dans la plupart des cas.

35voto

Alex Points 69

Pour développer La réponse de cristobalito :

Je suppose que vous parlez de la ligne de commande - si c'est dans un script, alors une nouvelle ligne >agit comme un délimiteur de commande.

Sur la ligne de commande, utilisez un point-virgule ';'.

Par exemple :

Signer un script PowerShell en ligne de commande. Pas de retour à la ligne.

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

14 votes

Pas la réponse à la question, mais votre réponse a répondu à ma question :)

1 votes

C'est intéressant, mais c'est l'opposé de ce que le PO demandait. L'OP voulait répartir une seule commande sur plusieurs lignes ; vous avez expliqué comment combiner plusieurs commandes sur une seule ligne.

3voto

cristobalito Points 2683

Je suppose que vous parlez de la ligne de commande - si c'est dans un script, alors une nouvelle ligne agit comme un délimiteur de commande.

Sur la ligne de commande, utilisez un point-virgule ';'.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X