Echo, Write-Host, Write-Output, Write-Verbose: Text ausgeben in PowerShell


    Tags:

    PowerShell Konsole IconPowerShell verfügt über mehrere Mecha­nismen, um Text oder den Inhalt von Variablen auf dem Bild­schirm darzustellen. Dabei sind die Unter­schiede zwischen den ver­schiedenen Cmdlets erheblich, so dass uner­wünschte Neben­effekte 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 voll­ständige Liste findet sich hier).

    Write-Host in Aktion: Ausgabe in Farbe und mit Separator

    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öglich­keiten 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 wieder­verwenden oder weitergeben möchte, dann empfiehlt sich die Verwendung von Write-Output. Dafür existiert das vordefinierte Alias Echo.

    Aufruf von Write-Output mit und ohne NoEnumerate

    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 beispiels­weise die eigentliche Ausgabe auf dem Bildschirm anzeigen und die Fehler­meldungen 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".

    Keine Kommentare