Zum Hauptinhalt springen

Text (formatiert) ausgeben

Einen String erzeugt man in Powershell, indem man Text in Anführungszeichen setzt. Dabei unterscheidet Powershell einfache (') und doppelte (") Anführungszeichen:

$Name = 'Holger'
$Kommentar = 'Sie verwenden die Variable $name'
$Begruessung = "Hallo $name"
$Kommentar
> Sie verwenden die Variable $name
$Begruessung
> Hallo Holger

Einfache Anführungszeichen werden "buchstäblich" interpretiert, weshalb sie als literal String bezeichnet werden, während bei doppelten Anführungszeichen der Inhalt des Textes noch einmal auf Steuerzeichen untersucht wird. Im obigen Beispiel wird der Kommentar buchstäblich so wiedergegeben, wie er angegeben wurde. In der Begrüßung, die in doppelten Anführungszeichen steht, wurde $Name durch den Namen ersetzt, der in der Variablen $Name gespeichert ist.

Wenn Sie Sonderzeichen in doppelten Anführungszeichen verwenden wollen, nutzen Sie den Backtick (im Französischen der Accent grave), manchmal auch liebevoll als Fliegendreck bezeichnet:

"Sie verwenden die Variable `$name"
Sie verwenden die Variable $name

Der Backtick ist die sogenannte Escape-Sequenz, die Powershell sagt, dass das nach dem Backtick folgende Zeichen ein Steuerzeichen ist. In den meisten anderen Sprachen wird als Escape -Sequenz der Backslash \ verwendet. Der Backtick ist wie der Backslash, aber nur halb so lang.

Wie Sie hier sehen können, kann man in Powershell einen Text einfach ausgeben, ohne einen ausdrücklichen Ausgabebefehl zu verwenden. Das Ergebnis dieses Befehls ist absolut identisch mit

Write-Output -InputObject "Sie verwenden die Variable `$name"
> Sie verwenden die Variable $name

Write-Output ist grundsätzlich nicht notwendig und ist vor allem dazu da, Programmierern, die bisher in anderen Programmiersprachen mit Ausgabebefehlen wie Print gearbeitet haben, ein gutes Gefühl zu vermitteln. Anders verhält es sich mit Write-Host. Er scheint erst einmal grundsätzlich das gleiche Ergebnis zu erzielen.

Write-Host -Object "Ich schreibe in den Host"

Tatsächlich schreibt er aber direkt in das Textfenster, während Write-Output in die sogenannte Standardausgabe schreibt (mehr dazu im Abschnitt Pipeline). Ausgaben in die Standardausgabe können weiterverarbeitet werden, indem man Sie einfach ein eine Variable umleitet, während Write-Host direkt das Fenster manipuliert. Versuchen Sie deshalb, Write-Host zu meiden, es sei denn, Sie müssen eine farbige Ausgabe erzwingen, oder geben Daten aus dem Skript aus, die ganz sicher für niemanden mehr wertvoll sind. Fehler oder sonstige Ausgaben sollten niemals mit Write-Host ausgegeben werden - verwenden Sie dafür das Cmdlet Write-Error. 

Write-Host 'Deswegen bin ich böse!' -ForegroundColor Red -BackgroundColor Yellow
Write-Error 'Es ist ein Fehler aufgetreten' # wird in die Fehlerausgabe geschrieben und von dort in die Konsole umgeleitet

(Farbige Ausgaben brauchen Sie in Powershell aber eher selten, da Sie immer nur Objekte zurückliefern sollten. Am besten streichen Sie Write-Host einfach aus Ihrem Wortschatz.)

Der Format-Operator -f

Eine bessere Variante für formatierte Ausgabe ist der Format-Operator -f

$User = 'Holger' 'Hallo {0}' -f $User
> Hallo Holger

 -f steht hinter einem String und besagt, dass das hinter -f folgende Array in den vorstehenden Text eingefügt werden sollen. Im Text verweist man auf die Elemente des Arrays über den in geschweiften Klammern angegebenen Index. Folgende zwei Befehle zeitigen also das gleiche Ergebnis:

'Hallo {0}' -f $User
> Hallo Holger
"Hallo $User"
> Hallo Holger

Der Format-Operator spielt seine Stärke aus, sobald auf Eigenschaften eines Objekts verwiesen werden soll.

$Files = Get-ChildItem -Path C:\Windows\System32 -File 'Der Windows-Ordner enhält {0} Dateien' -f $Files.Length
> Der Windows-Ordner enhält 4315 Dateien
"Der Windows-Ordner enthält $Files.length Dateien"
> Der Windows-Ordner enthält 0 07409496-a423-4a3e-b620-2cfb01a9318d_HyperV-ComputeNetwork.dll @Advancztrace_maps.dll.length Dateien

Die Ausgabe mit dem -f gibt uns als Text die Anzahl der Dateien im Ordner zurück. Die zweite Ausgabe zeitigt allerdings nicht das gewünschte Ergebnis. Stattdessen werden jede Menge Dateinamen ausgegeben. Das liegt daran, dass Powershell den Variablennamen nur bis zum Punkt interpretiert. Die Variable $Files ist aber ein Array mit 4903 Datei-Objekten. Powershell wandelt jedes Datei-Objekt in Text um. Dabei bleibt nur noch der Dateiname übrig. Anschließend hängt Powershell noch den Text ".Length Dateien" an.

Der Format-Operator kann aber noch deutlich mehr, da er Zahlen formatiert ausgeben kann. Dafür geben Sie hinter dem Index mit einem Doppelpunkt getrennt Formatierungs-Optionen an. Die einfachsten Optionen sind 0 und #, wobei 0 für eine Pflichtstelle steht, # für eine optionale Stelle, die nur ausgegeben wird, wenn in der auszugebenden Zahl die Stelle auch vorhanden ist.

'{0:#,##0.00} MB' -f 100.7 # Ausgabe mit 1000-Trenner (=,) und 2 Nachkommastellen
> 100,70 MB
'{0:#,##0.00} MB' -f 20100
> 20.100,00 MB

Eine ausführliche Beschreibung aller Formatierungs-Optionen finden Sie auf https://docs.microsoft.com/en-us/dotnet/standard/base-types/formatting-types oder kurz https://bit.ly/2zxuCVg und den folgenden Seiten. Wenn Sie eine kurze Fassung bevorzugen, schauen Sie unter https://devblogs.microsoft.com/scripting/use-powershell-to-format-strings-with-composite-formatting/ oder kurz https://bit.ly/2TEGyLT nach.

 
$Files = Get-ChildItem -Path C:\Windows\System32 -File 'Der Windows-Ordner enhält {0} Dateien' -f $Files.Length
> "Der Windows-Ordner enthält $Files.length Dateien"
> Der Windows-Ordner enthält 0 07409496-a423-4a3e-b620-2cfb01a9318d_HyperV-ComputeNetwork.dll @Advancztrace_maps.dll.length Dateien