Tags: PowerShell
PowerShell verfügt über mehrere Mechanismen, um Text oder den Inhalt von Variablen auf dem Bildschirm darzustellen. Dabei sind die Unterschiede zwischen den verschiedenen Cmdlets erheblich, so dass unerwünschte Nebeneffekte auftreten können, wenn man sich für das falsche entscheidet.
In vielen Fällen ist es gar nicht notwendig, ein Cmdlet zu bemühen, um etwa Zeichenketten oder Variablen auf der Konsole auszugeben. Beide oder eine Kombination aus ihnen werden automatisch ausgedruckt, wenn man sie auf der Befehlszeile oder in einem Script eingibt:
$z = "Zeichenketten"
"PowerShell gibt $z auch ohne Befehlswort aus"
Write-Host mit zusätzlichen Optionen
Die Notwendigkeit für Cmdlets ergibt sich erst dann, wenn man den Output modifizieren möchte. Die meisten Optionen bietet hier Write-Host. Eine gängige Anforderung besteht etwa darin, die Ausgabe in bestimmten Farben darzustellen. Write-Host unterstützt zu diesem Zweck die Parameter ForegroundColor und BackgroundColor.
Write-Host -ForegroundColor Yellow "Das erscheint in gelber Schrift!"
Für die Farbwerte hat Microsoft eine Reihe von Konstanten wie etwa Blue, Grey oder Cyan definiert, die man als Argumente verwenden kann (eine vollständige Liste findet sich hier).
Ein weiteres Feature von Write-Host besteht darin, dass man bei der Ausgabe von Arrays bestimmen kann, wie die einzelnen Elemente voneinander getrennt werden. Standardmäßig erscheint jedes von ihnen in einer eigenen Zeile:
1 .. 10 | Write-Host
Dies kann man mit dem Schalter NoNewline verhindern. Alternativ lässt sich mit Separator aber auch ein Trennzeichen definieren, das zwischen die Elemente eingefügt wird:
Write-Host (1 .. 10) -Separator "--"
Von Write-Host in Scripts ist abzuraten
Auch wenn Write-Host diese zusätzlichen Möglichkeiten zur Formatierung bietet, ist es mit Vorsicht zu genießen. Es hat nämlich die Eigenheit, den Output grundsätzlich auf den Bildschirm zu schreiben. Dabei lässt es sich weder von einem Redirect noch von einer Pipeline beirren:
Write-Host "Das kommt nicht in test.log an" > test.log
1 .. 10 | % {Write-Host $_} | where {$_ -lt 5}
Im zweiten Beispiel gibt Write-Host einfach alle Zahlen von 1 bis 10 aus, ohne dass Where-Object die Möglichkeit hätte, sie zu filtern.
Unerwünscht kann ein solches Verhalten etwa sein, wenn der Autor eines Scripts Write-Host verwendet, aber der Benutzer die Ausgabe desselben in eine Datei umleiten möchte. Aus diesem Grund meint Jeffrey Snover, der Erfinder von PowerShell, dass der Einsatz von Write-Host fast immer falsch ist (siehe sein Blog-Post: Write-Host Considered Harmful).
Write-Output (Alias echo)
Wenn man die spezifischen Fähigkeiten von Write-Host nicht benötigt oder Scripts erstellt, die man wiederverwenden oder weitergeben möchte, dann empfiehlt sich die Verwendung von Write-Output. Dafür existiert das vordefinierte Alias Echo.
Da man in PowerShell normalerweise ja kein Cmdlet braucht, um Text, Variablen oder den Output von Ausdrücken auf der Konsole auszugeben, spricht für Write-Output in erster Linie der Schalter NoEnumerate. Wenn man ein Array in einem Stück über eine Pipe an ein folgendes Cmdlet übergeben möchte, dann ist es das Mittel der Wahl. In diesem Fall würde
Write-Output -NoEnumerate 1,2,3,4 | %{ $_ + 1}
als Ergebnis nicht die Zahlen 2 bis 5 ausgeben, sondern 1 bis 4 und eine 1 anhängen. Die Addition mit jedem einzelnen Element des Arrays klappt nur ohne diesen Schalter.
Fehlermeldungen mit Write-Error ausgeben
Write-Output schreibt Informationen in den normalen Output Stream. Will man jedoch eine Fehlermeldung ausgeben, dann sollte man dafür Write-Error verwenden. Es füttert damit den Error-Stream (Nummer 2), der sich gesondert umleiten lässt:
Write-Error "Fehler!" 2> t.log
Interessant ist diese Option vor allem für Scripts, wo man dann beispielsweise die eigentliche Ausgabe auf dem Bildschirm anzeigen und die Fehlermeldungen in eine Datei schreiben kann.
Output nach Bedarf mit Write-Verbose
Eine besondere Funktion erfüllt Write-Verbose. Es schreibt Informationen in einen eigenen Message Stream (Nummer 4), der standardmäßig nicht auf dem Bildschirm angezeigt wird. Ruft man Write-Verbose jedoch mit dem Schalter Verbose auf, dann erscheint der Output:
Write-Verbose "Script beginnt mit dem Kopieren der Dateien …" -Verbose
Alternativ kann man vor der Ausführung eines Scripts, das Write-Verbose verwendet, die Variable $VerbosePreference auf den Wert "Continue" setzen, um die Ausgabe sichtbar zu machen. Voreingestellt
ist "SilentlyContinue".
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
Weitere Links