it-swarm.com.de

Wie verkette ich Strings und Variablen in PowerShell?

Angenommen, ich habe den folgenden Ausschnitt:

$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 zeigt:

42 - Slim Shady - Eminem

Stattdessen zeigt es:

42 + - + Slim Shady + - + Eminem

Ich denke daher, dass der +-Operator nicht dazu geeignet ist, Strings und Variablen zu verketten.

Wie sollten Sie dies mit PowerShell angehen?

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

Siehe Windows PowerShell-Sprachspezifikation Version 3.0 , S34, Unterausdrücke.

459
David Brabant

Niemand scheint den Unterschied zwischen einfachen und doppelten Anführungszeichen erwähnt zu haben. (Ich benutze PowerShell 4).

Sie können dies tun (wie @Ben sagte):

$name = 'Slim Shady'
Write-Host 'My name is'$name
-> My name is Slim Shady

Oder Sie können das tun: 

$name = 'Slim Shady'
Write-Host "My name is $name"
-> My name is Slim Shady

Die einfachen Anführungszeichen beziehen sich auf das Literal. Geben Sie die Zeichenfolge genau wie folgt aus. Die doppelten Anführungszeichen sind für Vorabverarbeitungen (wie Variablen, Sonderzeichen usw.)

So:

$name = "Marshall Bruce Mathers III"
Write-Host "$name"
-> Marshall Bruce Mathers III

Wohingegen:

$name = "Marshall Bruce Mathers III"
Write-Host '$name'
-> $name

( http://ss64.com/ps/syntax-esc.html finde ich gut als Referenz).

154
TinyRacoon

Ein Weg ist:

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

Eine andere ist:

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

Oder einfach (aber ich mag es nicht;)):

Write-Host $assoc.Id  "  -  "   $assoc.Name  "  -  "  $assoc.Owner
111
CB.

Sie können auch -join verwenden.

Z.B.

$name = -join("Jo", "h", "n");

Würde "John" $ name zuweisen.

Also in einer Zeile ausgeben:

Write-Host (-join("Jo", "h", "n"))
60
manyways

Versuchen Sie, das zu verpacken, was Sie in Klammern ausdrucken möchten:

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

Ihr Code wird so interpretiert, wie viele Parameter an Write-Host übergeben werden. Durch das Einschließen in Klammern werden die Werte verkettet und der resultierende Wert als einzelner Parameter übergeben.

45
goric

Eine weitere Option 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)"
19
Frode F.

Sie müssen den Ausdruck in Klammern setzen, damit er nicht als andere Parameter des Cmdlets behandelt wird:

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

Während Ausdruck:

"string1" + "string2" + "string3"

wird die Zeichenfolgen verketten. Sie müssen ein $ vor die Klammer setzen, damit es als einzelnes Argument ausgewertet wird, wenn es an einen Powershell-Befehl übergeben wird. Beispiel:

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

Wenn Sie möchten, dass es sich über mehrere Zeilen erstreckt, müssen Sie am Ende der Zeile die Ackward-Backtick-Syntax verwenden (ohne Leerzeichen oder Zeichen rechts vom Backtick). Beispiel:

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

(Ich glaube, Powershell ist derzeit etwas falsch implementiert, da unnötige Back-Ticks zwischen den Klammern erforderlich sind. Wenn Microsoft nur den Regeln für "Python" oder "TCL") folgen würde, die es Ihnen erlauben, so viele Zeilenumbrüche zwischen Start und einzufügen Wenn Sie die Klammern beenden, lösen Sie die meisten Probleme, die die Leute nicht mögen, wenn die Powershell-Funktion im Zusammenhang mit der Zeilenfortsetzung und der Verkettung von Strings steht wirklich flockig und unvorhersehbar, wenn es funktioniert .. es ist besser, einfach die Backticks hinzuzufügen.)

13
Bill Moore

Hier ist ein anderer Weg als Alternative:

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

Ich möchte nur einen anderen Weg mit .NET String.Format :

$name = "Slim Shady"
Write-Host ([string]::Format("My name is {0}", $name))
8
Martin Brandl

Diese Antworten erscheinen alle sehr kompliziert. Wenn Sie dies in einem PowerShell-Skript verwenden, können Sie dies einfach tun:

$name = 'Slim Shady'
Write-Host 'My name is'$name

Es wird ausgegeben

Mein Name ist Slim Shady

Beachten Sie, wie für Sie ein Leerzeichen zwischen den Wörtern eingefügt wird

6
elev8ed

Aus Was ist in PowerShell zu tun/nicht zu tun: Teil 1:

$id = $assoc.Id
$name = $assoc.Name
$owner = $assoc.owner
"$id - $name - $owner"
6
E.V.I.L.

Verketten Sie Strings wie in den DOS-Tagen. Dies ist eine große Sache für die Protokollierung, also los geht's:

$strDate = Get-Date
$strday = "$($strDate.Year)$($strDate.Month)$($strDate.Day)"

Write-Output "$($strDate.Year)$($strDate.Month)$($strDate.Day)"
Write-Output $strday
4
Kelly Davis

Ich scheine mit diesem (und vielen anderen nicht intuitiven Dingen) jedes Mal zu kämpfen, wenn ich PowerShell nach einiger Zeit benutze. Daher entscheide ich mich für:

[string]::Concat("There are ", $count, " items in the list")
4
Luke Puplett

Write-Host kann auch so verketten: 

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

Dies ist der einfachste Weg, IMHO.

2
Mordechai

(Aktuelle PS-Version 5.1.17134.407)

Ich denke, es ist alles gesagt und getan, aber das funktioniert jetzt auch:

$myVar = "Hello"

echo "${myVar} World"
1
Benjamin

Nur zum Spaß. Sie können auch wie folgt direkt auf die Werte des PSObject zugreifen:

$assoc.psobject.Properties.value -join " - "

Wenn Sie jedoch nicht angeben, dass das Objekt geordnet werden soll, zeigt Powershell die Werte in zufälliger Reihenfolge an. So sollte das Flag [bestellt] hinzufügen

$assoc = [pscustomobject] [ordered] @{
    Id = 42
    Name = "Slim Shady"
    Owner = "Eminem"
}
0
R.Amersfoort
$assoc = @{
    Id = 34
    FirstName = "John"
    LastName = "Doe"
    Owner = "Wife"
}

$assocId = $assoc.Id
$assocFN = $assoc.FirstName
$assocLN = $assoc.LastName
$assocName = $assocFN, $assocLN -Join " "
$assocOwner = $assoc.Owner

$assocJoin = $assocId, $assocName, $assocOwner -join " - "
$assocJoin
#Output = 34 - John Doe - Wife
0
blayderunner123