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?
Write-Host "$($assoc.Id) - $($assoc.Name) - $($assoc.Owner)"
Siehe Windows PowerShell-Sprachspezifikation Version 3.0 , S34, Unterausdrücke.
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).
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
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"))
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.
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)"
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)
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.)
Hier ist ein anderer Weg als Alternative:
Write-Host (" {0} - {1} - {2}" -f $assoc.Id, $assoc.Name, $assoc.Owner)
Ich möchte nur einen anderen Weg mit .NET String.Format :
$name = "Slim Shady"
Write-Host ([string]::Format("My name is {0}", $name))
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
Aus Was ist in PowerShell zu tun/nicht zu tun: Teil 1:
$id = $assoc.Id
$name = $assoc.Name
$owner = $assoc.owner
"$id - $name - $owner"
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
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")
Write-Host kann auch so verketten:
Write-Host $assoc.Id" - "$assoc.Name" - "$assoc.Owner
Dies ist der einfachste Weg, IMHO.
(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"
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"
}
$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