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 dieses Snippet Folgendes zeigt:
42 - Slim Shady - Eminem
Aber stattdessen zeigt es:
42 + - + Slim Shady + - + Eminem
Aus diesem Grund denke ich, dass der +
Operator nicht zum Verketten von Zeichenfolgen und Variablen geeignet ist.
Wie sollten Sie dies mit PowerShell angehen?
powershell
string-concatenation
Ninja Cowgirl
quelle
quelle
Write-host ($assoc.Id.ToString() + " - " + $assoc.Name + " - " + $assoc.Owner)
hier $ assoc.Id ist eine,Int32
daher müssen wir seine Zeichenfolgendarstellung verwenden. Andernfalls versucht PS, anstelle der Verkettung eine arithmetische Addition durchzuführen.Antworten:
Weitere Informationen finden Sie in der Windows PowerShell-Sprachspezifikation Version 3.0 , S. 34, Erweiterung der Unterausdrücke.
quelle
Write-Output
et al. , Daher ist sie wahrscheinlich die nützlichste in Ihrer Toolbox."... $name ..."
funktioniert yes trotzdem, aber in der ursprünglichen Frage, für die diese Antwort adressiert ist, lautet die Frage, wie auf Objekteigenschaften zugegriffen werden kann. Wenn dies$name.id -eq 42
dann"... $name.id ..."
nicht so funktioniert, wie Sie es möchten, weil es... @{id=42}.id ...
anstelle des gewünschten Renderings angezeigt wird... 42 ...
, verwenden Sie dazu die Methode der Antwort"... $($name.id) ..."
. Ich setze ein Lesezeichen für eine Frage, die später bearbeitet werden soll.Niemand scheint den Unterschied zwischen einfachen und doppelten Anführungszeichen erwähnt zu haben. (Ich verwende PowerShell 4).
Sie können dies tun (wie @Ben sagte):
Oder Sie können dies tun:
Die einfachen Anführungszeichen stehen für Literal. Geben Sie die Zeichenfolge bitte genau so aus. Die doppelten Anführungszeichen gelten für den Fall, dass eine Vorverarbeitung durchgeführt werden soll (z. B. Variablen, Sonderzeichen usw.).
Damit:
Wohingegen:
( http://ss64.com/ps/syntax-esc.html Ich finde gut als Referenz).
quelle
Ein Weg ist:
Ein anderer ist:
Oder einfach (aber ich mag es nicht;)):
quelle
$assoc.Id
und"
(et al.) Hinzu . Das heißt, Option 1 gibt IhnenId__-__Name__-__Owner
(zwei Leerzeichen auf jeder Seite von jedem-
), aber Option 3 gibtId___-___Name___-___Owner
( drei Leerzeichen).$assoc.Id"###"$assoc.Name
werden Räume zu beiden Seiten des ### hinzufügen, wo"$($assoc.Id)###$($assoc.Name)"
wird nicht .Sie können auch verwenden
-join
Z.B
Würde "John" $ name zuweisen.
Also in einer Zeile ausgeben:
quelle
Versuchen Sie, alles, was Sie ausdrucken möchten, in Klammern zu setzen:
Ihr Code wird als viele Parameter interpretiert, an die übergeben wird
Write-Host
. Wenn Sie es in Klammern setzen, werden die Werte verkettet und der resultierende Wert als einzelner Parameter übergeben.quelle
Write-Debug
oderWrite-Verbose
zum Einfügen von doppelten Anführungszeichen und variablen Werten verwende, wie z. B.Write-Debug ('Running "cmdlet" with parameter $MyVar = ' + $MyVar + " at time " + (Get-Date -DisplayHint Time))
Eine weitere Option ist:
Die "beste" Methode ist wahrscheinlich die von CB vorgeschlagene:
quelle
StringBuilder
Option hinzufügen, wenn Sie verrückt werden. ; ^)Sie müssen den Ausdruck in Klammern setzen, um zu verhindern, dass sie als unterschiedliche Parameter für das Cmdlet behandelt werden:
quelle
Während Ausdruck:
verkettet die Zeichenfolgen. Sie müssen ein $ vor die Klammer setzen, damit es als einzelnes Argument ausgewertet wird, wenn es an einen Powershell-Befehl übergeben wird. Beispiel:
Wenn Sie möchten, dass es mehrere Zeilen umfasst, müssen Sie als Bonus die ackward-Backtick-Syntax am Ende der Zeile verwenden (ohne Leerzeichen oder Zeichen rechts vom Backtick). Beispiel:
(Eigentlich denke ich, dass Powershell derzeit ein wenig falsch implementiert ist, da unnötige Backticks zwischen Klammern erforderlich sind. Wenn Microsoft nur die Regeln für "Python" - oder "TCL" -Klammern befolgen würde, können Sie zwischen dem Starten und "so viele Zeilenumbrüche setzen, wie Sie möchten Wenn Sie die Klammern beenden, lösen sie die meisten Probleme, die die Leute an Powershell im Zusammenhang mit der Zeilenfortsetzung und der Verkettung von Zeichenfolgen nicht mögen. Ich habe festgestellt, dass Sie die Back-Ticks manchmal bei Zeilenfortsetzungen zwischen Klammern weglassen können, aber es ist wirklich flockig und unvorhersehbar, wenn es funktioniert .. es ist besser, nur die Backticks hinzuzufügen.)
quelle
Hier ist ein anderer Weg als Alternative:
quelle
Ich möchte nur einen anderen Weg finden, um dies mit .NET String.Format zu tun :
quelle
String.Format
anstelle der alten Ebene"{0}" -f $var
? Ich sehe keinen Sinn in der Verwendung von .NET-Code, wo einfache PowerShell die Arbeit erledigen kann ...(Aktuelle PS-Version 5.1.17134.407)
Es ist alles gesagt und getan, aber das funktioniert ab sofort auch:
Hinweis: Dies funktioniert nur mit doppelten Anführungszeichen
quelle
Diese Antworten scheinen alle sehr kompliziert zu sein. Wenn Sie dies in einem PowerShell-Skript verwenden, können Sie dies einfach tun:
Es wird ausgegeben
Beachten Sie, wie für Sie ein Leerzeichen zwischen den Wörtern eingefügt wird
quelle
Von dem, was in PowerShell zu tun / nicht zu tun ist: Teil 1 :
quelle
Verketten Sie Zeichenfolgen wie in den DOS-Tagen. Dies ist eine große Sache für die Protokollierung.
quelle
toString
Option einfacher ist:(Get-Date).toString('yyyyMMdd')
Ich habe jedes Mal Probleme damit (und mit vielen anderen unintuitiven Dingen), wenn ich PowerShell nach einiger Zeit benutze. Deshalb entscheide ich mich jetzt für:
quelle
Write-Host kann auch so verketten:
Dies ist meiner Meinung nach der einfachste Weg.
quelle
quelle
Wenn Sie Zeichenfolgen zum Erstellen von Dateipfaden verketten, verwenden Sie den Befehl join-path:
Es werden automatisch die entsprechenden nachgestellten / führenden Schrägstriche für Sie hinzugefügt, was die Sache viel einfacher macht.
Ich entschuldige mich, wenn dies zu weit vom Thema entfernt ist, aber ich dachte, es könnte einigen helfen.
Wenn ich PowerShell eine Weile nicht benutze, vergesse ich manchmal, dass es existiert, und suche nach den Verkettungsoperatoren.
quelle
Sie können auch auf C # /. NET-Methoden zugreifen, und Folgendes funktioniert ebenfalls:
quelle
Nur zum Spaß. Sie können auch wie folgt direkt auf die Werte des PSObject zugreifen:
Wenn Sie jedoch nicht angeben, dass das Objekt sortiert werden soll, zeigt Powershell die Werte in zufälliger Reihenfolge an. Also sollte die Flagge hinzufügen [bestellt]
quelle