So teilen Sie lange Befehle in PowerShell auf mehrere Zeilen auf


227

Wie können Sie einen Befehl wie den folgenden in PowerShell auf mehrere Zeilen aufteilen?

&"C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web" -dest:contentPath="c:\websites\xxx\wwwroot\,computerName=192.168.1.1,username=administrator,password=xxx"


Mögliches Duplikat von Wie
— Michael Freidgeim

Antworten:


321

Nachlaufender Backtick-Charakter, dh

&"C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" `
-verb:sync `
-source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web" `
-dest:contentPath="c:\websites\xxx\wwwroot,computerName=192.168.1.1,username=administrator,password=xxx"

Leerraum ist wichtig. Das erforderliche Format ist Space`Enter.


1
Dies scheint die Funktionalität des Befehlsverlaufs (Aufwärtspfeil) zu beeinträchtigen. da jede Zeile als separater Befehl angezeigt wird. Gibt es einen Weg, dies zu umgehen?
— Richard Ev

2
Wenn Sie Powershell 3 oder höher ausführen, lesen Sie github.com/lzybkr/psreadline. Der Verlaufsdurchlauf ist für mehrzeilige Anweisungen behoben.
— x0n

43
Der Platz vor dem Back-Tick ist erforderlich # auf die harte Tour gelernt
— Josh Graham

29
@ josh-graham Und nach dem Back-Tick sollte KEIN Leerzeichen (oder Inline-Kommentar) vorhanden sein. # auf die harte
— Tour

1
Backticks sind spröde (wie in den obigen Kommentaren angegeben) und beim Parsen oder Überprüfen einer Datei schwer zu finden. Die Antwort von @StevenPenny ist besser, wenn Sie den Code einfacher debuggen möchten.
— mjd2

67

Eine andere Methode für eine sauberere Argumentübergabe wäre das Splattern .

Definieren Sie Ihre Parameter und Werte wie folgt als Hashtabelle:

$params = @{ 'class' = 'Win32_BIOS';
             'computername'='SERVER-R2';
             'filter'='drivetype=3';
             'credential'='Administrator' }

Rufen Sie dann Ihr Commandlet folgendermaßen auf:

Get-WmiObject @params

Microsoft Docs: Informationen zum Splattern

TechNet Magazine 2011: Windows PowerShell: Splatting

Sieht so aus, als würde es mit Powershell 2.0 und höher funktionieren


5
Das ist wunderbar! UND Sie können Parameter wie diesen hinzufügen: $params.add('name','Bob Newhart') ramblingcookiemonster.wordpress.com/2014/12/01/…
— bgmCoder

1
Die Semikolons sind in Ordnung, aber überflüssig. Nur erforderlich, wenn mehrere Werte pro Zeile vorhanden sind.
— Jim Birch

38

Ah, und wenn Sie eine sehr lange Zeichenfolge haben, die Sie auflösen möchten, z. B. HTML, können Sie dies tun, indem Sie @auf jeder Seite des Äußeren ein Zeichen setzen "- wie folgt:

$mystring = @"
Bob
went
to town
to buy
a fat
pig.
"@

Sie erhalten genau das:

Bob
went
to town
to buy
a fat
pig.

Und wenn Sie Notepad ++ verwenden , wird es sogar korrekt als Zeichenfolgenblock hervorgehoben.

Wenn Sie möchten, dass diese Zeichenfolge auch doppelte Anführungszeichen enthält, fügen Sie sie einfach wie folgt hinzu:

$myvar = "Site"
$mystring = @"
<a href="http://somewhere.com/somelocation">
Bob's $myvar
</a>
"@

Sie würden genau das bekommen:

<a href="http://somewhere.com/somelocation">
Bob's Site
</a>

Wenn Sie jedoch in diesem @ -String doppelte Anführungszeichen verwenden, erkennt Notepad ++ dies nicht und schaltet die Syntaxfarbe so aus, als ob sie nicht in Anführungszeichen oder Anführungszeichen gesetzt wäre, je nach Fall.

Und was besser ist, ist Folgendes: Wo immer Sie eine $ -Variable einfügen, wird sie interpretiert! (Wenn Sie das Dollarzeichen im Text benötigen, schließen Sie es mit einem Häkchen wie dem folgenden an: `` $ not-a-variable`.)

BEACHTEN! Wenn Sie nicht die endgültige setzen Sie "@bei dem Anfang der Zeile , wird es scheitern. Ich brauchte eine Stunde, um herauszufinden, dass ich das in meinem Code nicht einrücken konnte!

Hier ist MSDN zu diesem Thema: Verwenden von Windows PowerShell "Here-Strings"


1
Ordentlicher Trick, aber wenn ich eine Variable $ habe ... scheint es nicht zu funktionieren. Ich bekomme "das Zeichen ist nach einem hier String String Header nicht erlaubt ..."
— tofutim

Ich glaube nicht, dass Sie einen Variablennamen brechen können, nur eine Zeichenfolge.
— BGMCoder

19

Sie können den Backtick-Operator verwenden:

& "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" `
    -verb:sync `
    -source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web" `
    -dest:contentPath="c:\websites\xxx\wwwroot\,computerName=192.168.1.1,username=administrator,password=xxx"

Das ist für meinen Geschmack immer noch etwas zu lang, daher würde ich einige gut benannte Variablen verwenden:

$msdeployPath = "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe"
$verbArg = '-verb:sync'
$sourceArg = '-source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web"'
$destArg = '-dest:contentPath="c:\websites\xxx\wwwroot\,computerName=192.168.1.1,username=administrator,password=xxx"'

& $msdeployPath $verbArg $sourceArg $destArg

1
Ich mag Variablennamen gegenüber anderen Vorschlägen, da dies möglicherweise die am besten lesbare Option für Nicht-Powershell-Experten ist. Wenn ich ein Tutorial / Setup-Handbuch sehen würde, das Splatting verwendet, wäre ich völlig verloren bei dem, was ohne ein Sub-Tutorial zum Splattern vor sich geht. Ebenso scheinen Backticks fragil und wahrscheinlich weniger bekannt zu sein als einfache, bewährte PS-Variablen.
— Josh Desmond

13

Wenn Sie eine Funktion haben:

$function:foo | % Invoke @(
  'bar'
  'directory'
  $true
)

Wenn Sie ein Cmdlet haben :

[PSCustomObject] @{
  Path  = 'bar'
  Type  = 'directory'
  Force = $true
} | New-Item

Wenn Sie eine Bewerbung haben:

{foo.exe @Args} | % Invoke @(
  'bar'
  'directory'
  $true
)

Oder

icm {foo.exe @Args} -Args @(
  'bar'
  'directory'
  $true
)

3

In PowerShell 5 und PowerShell 5 ISE ist es auch möglich, nur Shift+ Enterfür die mehrzeilige Bearbeitung zu verwenden (anstelle von Standard-Backticks `am Ende jeder Zeile):

PS> &"C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" # Shift+Enter
>>> -verb:sync # Shift+Enter
>>> -source:contentPath="c:\workspace\xxx\master\Build\_PublishedWebsites\xxx.Web" # Shift+Enter
>>> -dest:contentPath="c:\websites\xxx\wwwroot,computerName=192.168.1.1,username=administrator,password=xxx"

0

Splat-Methode mit Berechnungen

Wenn Sie die Splat-Methode wählen, achten Sie auf Berechnungen, die mit anderen Parametern durchgeführt werden. In der Praxis muss ich manchmal zuerst Variablen setzen und dann die Hash-Tabelle erstellen. Außerdem erfordert das Format keine einfachen Anführungszeichen um den Schlüsselwert oder das Semikolon (wie oben erwähnt).

Example of a call to a function that creates an Excel spreadsheet

$title = "Cut-off File Processing on $start_date_long_str"
$title_row = 1
$header_row = 2
$data_row_start = 3
$data_row_end = $($data_row_start + $($file_info_array.Count) - 1)

# use parameter hash table to make code more readable
$params = @{
    title = $title
    title_row = $title_row
    header_row = $header_row
    data_row_start = $data_row_start
    data_row_end = $data_row_end
}
$xl_wksht = Create-Excel-Spreadsheet @params

Hinweis: Das Dateiarray enthält Informationen, die sich darauf auswirken, wie die Tabelle gefüllt wird.


-1

Eine andere Möglichkeit, eine Zeichenfolge über mehrere Zeilen hinweg zu unterbrechen, besteht darin, einen leeren Ausdruck in die Mitte der Zeichenfolge zu setzen und ihn über Zeilen hinweg aufzuteilen:

Beispielzeichenfolge:

"stackoverflow stackoverflow stackoverflow stackoverflow stackoverflow"

über Linien gebrochen:

"stackoverflow stackoverflow $(
)stackoverflow stack$(
)overflow stackoverflow"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.