945 Stimmen

Wie kann ich in PowerShell Zeichenfolgen und Variablen verketten?

Nehmen wir an, ich habe das folgende Snippet:

$assoc = New-Object PSObject -Property @{
    Id = 42
    Name = "Slim Shady"
    Owner = "Eminem"
}

Write-Host $assoc.Id + "  -  "  + $assoc.Name + "  -  " + $assoc.Owner

Ich würde erwarten, dass dieser Ausschnitt dies zeigt:

42 - Slim Shady - Eminem

Aber stattdessen zeigt es:

42 + - + Slim Shady + - + Eminem

Das lässt mich glauben, dass die + Operator ist für die Verkettung von Zeichenketten und Variablen nicht geeignet.

Wie sollten Sie dies mit PowerShell angehen?

43voto

Bimo Punkte 5077

Während Ausdruck:

"string1" + "string2" + "string3"

die Zeichenfolge verkettet, müssen Sie ein $ vor die Klammer setzen, damit sie als einzelnes Argument ausgewertet wird, wenn sie an einen PowerShell-Befehl übergeben wird. Beispiel:

Write-Host $( "string1" + "string2" + "string3" )

Wenn Sie möchten, dass sich der Text über mehrere Zeilen erstreckt, müssen Sie außerdem die umständliche Backtick-Syntax am Ende der Zeile verwenden (ohne Leerzeichen oder Zeichen rechts vom Backtick).

Beispiel:

Write-Host $(`
    "The rain in "        +`
    "Spain falls mainly " +`
    "in the plains"       )`
    -ForegroundColor Yellow

(Meiner Meinung nach ist PowerShell derzeit ein wenig falsch implementiert, da unnötige Backticks zwischen Klammern erforderlich sind. Wenn Microsoft einfach folgen würde Python o Tcl Klammerregeln, die es erlauben, so viele Zeilenumbrüche wie gewünscht zwischen den Anfangs- und Endklammern einzufügen, dann würden sie die meisten Probleme lösen, die die Leute an PowerShell im Zusammenhang mit der Zeilenfortsetzung und der Verkettung von Zeichenfolgen nicht mögen.

Ich habe herausgefunden, dass man die Backticks bei Zeilenfortsetzungen zwischen Klammern manchmal weglassen kann, aber es ist wirklich unzuverlässig und unvorhersehbar, ob es funktioniert... Es ist besser, einfach

42voto

Frode F. Punkte 50085

Eine andere Möglichkeit ist:

$string = $assoc.ID
$string += " - "
$string += $assoc.Name
$string += " - "
$string += $assoc.Owner
Write-Host $string

Die "beste" Methode ist wahrscheinlich die von C.B. vorgeschlagene:

Write-Host "$($assoc.Id)  -  $($assoc.Name)  -  $($assoc.Owner)"

37voto

Richard Punkte 103159

Sie müssen die Ausdrücke in Klammern setzen, damit sie nicht als unterschiedliche Parameter für das Cmdlet behandelt werden:

Write-Host ($assoc.Id + "  -  "  + $assoc.Name + "  -  " + $assoc.Owner)

18voto

Benjamin Punkte 1057

(

T

$myVar = "Hello"

echo "${myVar} World"

N

14voto

Dave Sexton Punkte 10092

Hier ist eine andere Möglichkeit als Alternative:

Write-Host (" {0}  -  {1}  -  {2}" -f $assoc.Id, $assoc.Name, $assoc.Owner)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X