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"
Asgerhallas
quelle
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.

Colin Pickard
quelle
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

BJHop
quelle
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"

bgmCoder
quelle
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
Aaron Jensen
quelle
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
)
Steven Penny
quelle
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"
Schlecht
quelle
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.

Kennzeichen
quelle
-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"
Kirill Yunussov
quelle