it-swarm.com.de

So geben Sie einen mehrzeiligen Befehl ein

Ist es möglich, eine PowerShell-Befehlszeile auf mehrere Zeilen aufzuteilen?

In Visual Basic kann ich den Unterstrich (_) verwenden, um den Befehl in der nächsten Zeile fortzusetzen.

363
eXXL

Sie können ein Leerzeichen gefolgt vom Grabakzent (Backtick) verwenden:

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

Dies ist jedoch immer nur in den oben gezeigten Fällen erforderlich. Normalerweise erhalten Sie eine automatische Fortsetzung der Zeile, wenn ein Befehl zu diesem Zeitpunkt syntaktisch nicht vollständig sein kann. Dies beinhaltet das Starten eines neuen Pipeline-Elements:

Get-ChildItem |
  Select Name,Length

funktioniert ohne Probleme, da der Befehl nach dem | nicht abgeschlossen werden kann, da ein anderes Pipeline-Element fehlt. Wenn Sie geschweifte Klammern oder andere Klammern öffnen, können Sie die Zeile direkt fortsetzen:

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

Ähnlich wie beim | funktioniert auch ein Komma in einigen Kontexten:

1,
2

Beachten Sie jedoch, dass ähnlich wie bei JavaScript Automatische Semikoloneinfügung einige Dinge ähnlich unterbrochen sind, da der Zeilenumbruch an einer Stelle auftritt, an der er ist mit vorangestelltem gültigen Statement:

return
  5

wird nicht funktionieren.

Schließlich können Zeichenfolgen (in allen Sorten) auch über eine einzelne Zeile hinausgehen:

'Foo
bar'

Sie enthalten dann die Zeilenumbrüche in der Zeichenfolge.

552
Joey

Ich habe gerade herausgefunden, dass es zwischen dem hinteren Häkchen und dem Zeilenumbruch kein beliebiges Zeichen geben darf. Selbst Leerzeichen führen dazu, dass der Befehl nicht funktioniert.

58
Neffets

In den meisten C-ähnlichen Sprachen möchte ich meine geschweiften Klammern so platzieren, dass der Code meiner Meinung nach am einfachsten zu lesen ist.

Der Parser von PowerShell erkennt, wenn eine Anweisung eindeutig nicht vollständig ist, und wechselt in die nächste Zeile. Stellen Sie sich beispielsweise ein Cmdlet vor, das einen optionalen Skriptblockparameter akzeptiert:

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

wenn der Skriptblock sehr lang ist, möchten Sie vielleicht schreiben:

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

Dies funktioniert jedoch nicht: Der Parser sieht zwei Anweisungen. Der erste ist Get-Foo und der zweite ist ein Skriptblock. Stattdessen schreibe ich:

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

Ich könnte das Zeilenfortsetzungszeichen (`) verwenden, aber das führt zu schwer lesbarem Code und führt zu Fehlern.

Da in diesem Fall die offene Klammer in der vorherigen Zeile stehen muss, folge ich diesem Muster überall:

 if (Bedingung) {
 ..... 
} 

Beachten Sie, dass if -Anweisungen einen Skriptblock in der Sprachgrammatik erfordern, sodass der Parser in der nächsten Zeile nach dem Skriptblock sucht. Aus Gründen der Konsistenz belasse ich die offene Klammer jedoch in derselben Zeile.

Bei langen Pipelines breche ich einfach nach dem Pipe-Zeichen (|) ab:

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

So erweitern Sie die Antwort von Cristobalito :

Ich gehe davon aus, dass Sie in der Befehlszeile darüber sprechen - wenn es sich um ein Skript handelt, fungiert eine neue Zeile als Befehlstrennzeichen.

Verwenden Sie in der Befehlszeile ein Semikolon ';'

Zum Beispiel:

Signieren Sie ein PowerShell-Skript in der Befehlszeile. Keine Zeilenumbrüche.

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

In PowerShell und PowerShell ISE ist auch die Verwendung möglich Shift + Enter am Ende jeder Zeile für die mehrzeilige Bearbeitung (anstelle des Standard-Backtick `).

16
Bad

Wenn Sie versuchen, Zeichenfolgen in mehrere Zeilen zu trennen, können Sie das "+" verwenden. Zum Beispiel:

$header =    "Make," +

             "ComputerName," +

             "Model," +

             "Windows Version"

Wird so aussehen:

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

Ich gehe davon aus, dass Sie in der Befehlszeile darüber sprechen - wenn es sich um ein Skript handelt, fungiert eine neue Zeile als Befehlstrennzeichen.

Verwenden Sie in der Befehlszeile ein Semikolon ';'

2
cristobalito
  1. Verwenden Sie ein Semikolon ;, um den Befehl zu trennen
  2. Ersetzen Sie den doppelten Backslash \\ durch einen Backslash \.
  3. Verwenden Sie "', um eine sichere Adresse zu übergeben und einen Befehl wie "'PATH'" zu wechseln.

Mit diesem ps1-Befehl wird das pfx-Zertifikat für das Gebietsschema installiert.

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