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.
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.
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.
Et n'oubliez pas de mentionner que d'autres jetons agissent également comme des continuateurs de ligne, par ex. |
et {
.
@Keith : Merci, je l'ai inclus. Ceux-là étaient probablement trop évidents pour être mentionnés ;-)
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.
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
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 #>
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 } |
% {
.........
}
Comment if
et foreach
et try
fonctionne alors ? ils autorisent les blocs script sur la ligne suivante... cela signifie que cela doit être possible
@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 ?
@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.
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}
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.
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
Duplicata de ... stackoverflow.com/questions/2608144/
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.0 votes
Utilisez simplement le caractère ` pour séparer la commande sur plusieurs lignes