web-dev-qa-db-fra.com

Comment entrer une commande multiligne

Est-il possible de fractionner une ligne de commande PowerShell sur plusieurs lignes?

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

363
eXXL

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

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

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

Get-ChildItem |
  Select Name,Length

fonctionnera sans problème car après le |, la commande ne peut pas être terminée car il manque un autre élément de pipeline. De plus, ouvrir des accolades ou tout autre type de parenthèses permettra de poursuivre la ligne directement:

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

Semblable au |, une virgule fonctionnera également dans certains contextes:

1,
2

Cependant, gardez à l'esprit que, contrairement à JavaScript Insertion automatique de point-virgule , il y a des choses qui sont cassées de la même façon car le saut de ligne se produit à un point où est précédé d'une déclaration valide:

return
  5

ne fonctionnera pas.

Enfin, les chaînes (dans toutes les variétés) peuvent aussi s’étendre au-delà d’une seule ligne:

'Foo
bar'

Ils incluent les sauts de ligne dans la chaîne, alors.

552
Joey

Je viens de découvrir qu'il ne doit pas y avoir de caractère aucun entre le tick arrière et le saut de ligne. Même les espaces feront que la commande ne fonctionnera pas.

58
Neffets

Dans la plupart des langages de type C, je décide de placer mes accolades là où je pense qu’elles facilitent la lecture du code.

L'analyseur syntaxique de PowerShell reconnaît le moment où une déclaration n'est pas complète et regarde à la ligne suivante. Par exemple, imaginez une applet de commande prenant un paramètre de bloc de script facultatif:

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

si le bloc de script est très long, vous pouvez écrire:

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

Mais cela ne fonctionnera pas: l'analyseur verra deux déclarations. Le premier est Get-Foo et le second est un bloc de script. Au lieu de cela, j'écris:

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

Je pourrais utiliser le caractère de continuation de ligne (`) mais cela crée un code difficile à lire et invite aux bogues.

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

 if (condition) {
 ..... 
} 

Notez que les instructions if nécessitent un bloc de script dans la grammaire du langage. L'analyseur va donc rechercher le bloc de script sur la ligne suivante, mais par souci de cohérence, je garde l'accolade ouverte sur la même ligne.

De même, dans le cas de longs pipelines, je casse après le caractère de tuyau (|):

 $ project.Items | 
? {$ _. Key -eq "FichierFichier"} | 
% {$ _. Valeur} | 
% {$ _. EvaluatedInclude} | 
% {
 ......... 
} 
34
Jay Bazuzi

Pour développer réponse de cristobalito :

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

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

Par exemple:

Signer un script PowerShell sur la ligne de commande. Pas de rupture de ligne.

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

Dans PowerShell et PowerShell ISE, il est également possible d’utiliser Shift + Enter à la fin de chaque ligne pour l'édition multiligne (au lieu du backtick standard `).

16
Bad

Si vous essayez de séparer des chaînes en plusieurs lignes, vous pouvez utiliser le "+". Par exemple:

$header =    "Make," +

             "ComputerName," +

             "Model," +

             "Windows Version"

Ressemblera à:

$header = "Make,ComputerName,Model,Windows Version"
3
Steve Fellwock

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

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

2
cristobalito
  1. Utilisez un point-virgule ; pour séparer la commande
  2. Remplacez la double barre oblique inversée \\ sur les barres obliques inverses \.
  3. Utilisez "' pour transmettre une adresse sécurisée afin de passer une commande du type "'CHEMIN'".

Cette commande ps1 installe le certificat pfx de l'environnement local.

powershell -Command "$pfxPassword = ConvertTo-SecureString -String "12345678" -Force -AsPlainText ; Import-PfxCertificate -FilePath "'C:\\Program Files\\VpnManagement\\resources\\assets\\cert\\localhost.pfx'" Cert:\\LocalMachine\\My -Password $pfxPassword ; Import-PfxCertificate -FilePath "'C:\\Program Files\\VpnManagement\\resources\\assets\\cert\\localhost.pfx'" Cert:\\LocalMachine\\Root -Password $pfxPassword"
1
Moslem Shahsavan