Tags: PowerShell, Datum
Wenn ein Kommando eine Kombination aus Zeichenketten, nummerischen Werten und Variablen ausgeben soll, dann kann sie der Formatoperator "-f" diese fast beliebig anpassen. Besonders flexibel zeigt er sich bei Datumsangaben oder Zahlen. Gleichzeitig erhöht er die Lesbarkeit des Codes.
Wenn man in PowerShell Text und Variablen zusammen ausgeben will, dann platziert man im einfachsten Fall beide innerhalb der Anführungszeichen. Viel Kontrolle über das Aussehen des Outputs hat man dabei aber nicht. Alternativ akzeptiert ToString() die hier vorgestellten Format-Strings für die Aufbereitung von Zahlen.
Syntax für die Platzhalter
Der Formatoperator bietet eine zusätzliche Flexibilität durch Verwendung von Platzhaltern mit Index, die sich bei Bedarf auch mehrfach verwenden lassen. Sie stehen in geschweiften Klammern und enthalten optional noch eine Zahl für die Ausrichtung der Daten und eine Formatzeichenkette:
{<Index>[,<Ausrichtung>][:<Formatierung>]}
Ein einfaches Beispiel könnte so aussehen:
$tag = "Sonntag"
"Heute ist der {0}. {1} im September" -f "3", $tag
Das Ergebnis lautet erwartungsgemäß "Heute ist der 3. Sonntag im September". Wie man leicht erkennen kann, ersetzt PowerShell die Indizes in der Zeichenkette in der vorgegebenen Reihenfolge durch die Werte, die rechts vom Format-Operator stehen, also {0} durch "3" und {1} durch $tag.
Wie erwähnt, lässt sich ein Index auch mehrfach verwenden:
"Heute ist die {0}. Woche und der {0}. {1} im September" -f "3", $tag
Mit Leerzeichen auffüllen
Angenommen, man möchte einen Vornamen um so viele Leerzeichen auffüllen, damit eine Spaltenbreite von 25 Zeichen entsteht und sich damit eine rechtsbündige Ausrichtung ergibt:
"Vorname: {0,25}, Nachname: {1}" -f "Peter", "Müller"
Diese Formatierung ließe sich zum Beispiel auch auf eine Liste von Namen anwenden, die man aus dem Active Directory ausliest:
Get-ADUser -Filter * -SearchBase "OU=IT,DC=contoso,DC=local"|
foreach{"Vorname: {0,-20} Nachname: {1}" -f $_.givenname, $_.surname}
Hier würde jeder Vorname um die notwendige Zahl an Leerzeichen ergänzt, um eine Spaltenbreite von 20 zu erhalten. Eine negative Zahl bedeutet, dass der Formatoperator die Daten rechts auffüllt, während das sonst von links erfolgt.
Sein Verhalten ändert sich dabei auch nicht, wenn man ihm einen nummerischen Wert übergibt. Die Ausrichtung erfolgt hier ebenfalls über Leerzeichen. Will man in diesem Fall etwa eine Zahl mit Nullen auffüllen, dann geht das nur über die Formatoption, nicht über die Ausrichtung.
Strings für die Formatierung
Der Operator unterstützt für die Formatierung die von .NET stammenden Strings. Dazu zählen für Zahlen unter anderem:
D | Ganze Zahlen, auch mit negativem Vorzeichen |
E | Exponentialschreibweise |
F, N | Ganze oder Dezimalzahlen, auch mit Vorzeichen |
P | Prozent |
X | Hexadezimal |
C | Währung |
Bei allen außer bei F lässt sich die Zahl der ausgegebenen Stellen einfach durch eine entsprechende Angabe festlegen:
"Die Zahl PI {0:N2} mit 2 Dezimalstellen formatiert." -f 3.14159
Das Ergebnis ist erwartungsgemäß 3.14. Schneidet man Nachkommastellen auf diese Weise ab, dann runden N wie F:
"Die Zahl {0:N2} formatiert und gerundet" -f 1.555
gibt 1,56 aus.
Die Formatierung von Währungen hängt von der eingestellten Culture ab. Zu beachten ist weiterhin, dass die Darstellung im Hex-Format nur für ganzzahlige Werte möglich ist. Die Ausgabe in Prozent multipliziert die Zahl mal 100 und fügt ein Prozentzeichen hinzu:
"Die Zahl {0:N} als Prozent formatiert: {0:P}" -f (3/4)
Wie man hier sieht, akzeptiert der Formatoperator auch Ausdrücke, in diesem Beispiel ist es nur eine einfache Division. Es sind aber auch komplexe Ausdrücke oder der Aufruf von Cmdlets möglich:
"Vorname von Müller: {0}" -f (Get-ADUser -Filter 'surname -eq "Mueller"').givenname
Unter der Annahme, dass nur eine Person mit dem Nachnamen "Müller" im AD existiert, könnte man so ihren Vornamen anzeigen.
Für Zahlen gibt es neben den oben genannten Formatierungsoptionen noch '#' als Platzhalter für eine Ziffer. Damit ließe sich etwa eine Telefonnummer, die ohne Trennzeichen eingegeben wurde, ordentlich darstellen:
"Darstellung einer formatierten Telefonnummer {0:####-###-#####}" -f 004921156784
Der letzte Block im Muster sieht hinter der Ortsvorwahl 5 Stellen vor. Ist die Nummer länger, wird sie abgeschnitten, ist die jedoch kürzer, dann hat das keine Folgen.
Mit einem Komma lassen sich Tausendertrennzeichen einfügen:
"Mit Tausendertrennzeichen {0:#,#}" -f 100957243678
Datum formatieren
Über die Eigenschaften eines DateTime-Objekts, wie es zum Beispiel Get-Date zurückgibt, lassen sich Jahr, Tag, Monat oder Wochentag ohne großen Aufwand auslesen. Wenn man diese Bestandteile jedoch in einer bestimmten Form anordnen möchte, dann geht das mit dem Operator -f einfacher:
"Das heutige Datum ist {0:dddd}, der {0:dd.MM.yyyy}" -f (Get-Date)
Die Ausgabe sieht wie folgt aus:
Das heutige Datum ist Samstag, der 02.09.2017
Für die Formatierung von Datums- und Zeitangaben sind folgende Strings zulässig:
:ddd | Wochentag (abgekürzt) |
:dddd | Voller Name des Wochentags |
:dd | Tag des Monats |
:MMMM | Name des Monats |
:MM | Monat (nummerisch) |
:yy | Jahr 2-stellig |
:yyyy | Jahr 4-stellig |
:hh | Stunde |
:HH | Stunde im 24-Stundenformat |
:mm | Minuten |
:ss | Sekunden |
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
Weitere Links
2 Kommentare
wie kann ich denn Zahlen mit Nachkommastellen "auf deutsch" eingeben bei der Powershell? Z.B. $wert = 1,25
Die Powershell erwartet immer die amerikanische Notation: 1.25
Gibt es einen Weg?
Bei der Eingabe erwartet PowerShell immer einen Dezimalpunkt, die Ausgabe richtet es sich danach, was als (Get-Culture).NumberFormat.NumberDecimalSeparator eingestellt ist.