•  
  •  

Write-Host ist schädlich für Ihren Windows PowerShell Code

Der PowerShell „Erfinder“ und Entwicklungsleiter Jeffrey Snover hat auf seinem Blog einen Artikel geschrieben, den ich so wichtig finde, dass ich diesen hier frei übersetzt habe.

Wenn Sie Windows PowerShell Code schreiben oder überprüfen, möchte ich, dass Sie sich an die folgende Faustregel erinnern:

Write-Host zu benutzen ist fast immer falsch!

Write-Host  zu benutzen ist fast immer die Falsche Entscheidung, weil es für die Automation und Datenweitergabe nicht zu gebrauchen ist!

Es gibt typischerweise  zwei Gründe, warum jemand Write-Host benutzt:

1. Ergebnisse an der Konsole zu sehen.

Das Problem Write-Host zu benutzen um Ergebnisse an die Konsole weiterzuleiten ist, dass die Ergebnisse direkt zum Anzeige Display, dem Monitor gesendet werden. Das heißt, dass die Ergebnisse nicht von einem anderen Cmdlet, einer anderen Funktion oder einem anderen Skript benutzt werden können, um eine größere Aufgabe zu automatisieren. Immer wenn Sie eine Skript schreiben, Sie ein besonderes Problem lösen müssen und Sie ein Skript-Tool für Ihren  PowerShell Werkzeugkasten erstellen, das als Teil  benutzt werden kann um größere Probleme zu lösen, dann ist Write-Host die falsche Wahl. Wenn Sie Write-Host benutzen um Ergebnisse weiterzuleiten, haben Sie ein unbrauchbares Werkzeug in Ihrem Werkzeugkasten.

Das bessere Cmdlet für diese Aufgabe ist Write-Output (Alias Echo oder Write).

Bei der Benutzung von Write-Output werden die Ergebnisse sowieso am Bildschirm angezeigt. Write-Output legt die Ergebnisse aber auch in die Pipeline und ermöglicht Ihrem Skript in einer Pipeline benutzt zu werden (oder in einer  Foreach Schleife). Ebenso können die Ergebnisse von anderen Skripten oder Cmdlets benutzt werden.

2. Arbeitsinformation / Statusinformationen dem Benutzer Anzeigen (z. B. “bin Ich dabei, dies oder jenes auszuführen”).

Statusinformationen dem Benutzer Anzeigen  ist sehr nützlich (Ich wünsche, dass viele Leute dies häufiger machen würden). Aber auch hier ist Write-host der falsche Weg! Die Straße zur Hölle ist mit guten Absichten gepflastert! Wenn Sie Write-Host benutzen, um Statusinformationen anzuzeigen, pflastern Sie die Straße zur Hölle! PowerShell ist Automation! Statusinformation sind  oft hilfreich wenn Sie eine Skript das erste mal laufen lassen. Je öfter Sie das Skript dann ausführen wird diese informationsflut lästig und Sie Ärgern sich darüber. Wenn Sie Write-Host benutzen, kann der Benutzer sich nicht entscheiden ob er diese Information sehen will oder nicht.

Das richtige Cmdlet ist hier das Cmdlet Write-Verbose.

Durch das Aufrufen Ihres Skriptes mit dem Parameter -Verbose kann der Benutzer kontrollieren, ob er die Information sehen will oder nicht.
Write-host verhindert auch das Loggen (mitschreiben) der Informationen!
Informationen die  mit Write-host direkt zum Bildschirm geschickt werden können nicht in einem Logfile zum späteren Lesen mitgeschrieben werden! Wenn Sie das PowerShell Hilfethema „About_Redirection“ lesen, werden Sie sehen, dass Ihnen PowerShell die Fähigkeit gibt, verschiedene Daten-Ströme (Streams) umzuleiten. Das folgende Kommando wird den normalen Ausgabestrom von „Test-Script“ nehmen und es in die Datei o.txt ausgeben:

PS> Test-Script  | Out-File o.txt

Wenn das Test-Script Verbose-Information hat und Sie die folgende Zeile ausführen, würde der Verbose Strom zum Bildschirm gehen und der Ausgabestrom würde zur Datei gehen:

PS> Test-Script -Verbose | Out-File o.txt

Bei der Benutzung der PowerShell Umleitung, können Sie den Verbose Strom (der aus historischen Gründen die Nummer 4 hat) in den normalen Ausgabestrom “umleiten” (der die Nummer 1 hat) und dann werden beide Gruppen von Daten in die Datei gesendet:

PS> Test-Script -Verbose 4>&1  | Out-File o.txt

Die Syntax ist nicht sehr offensichtlich, aber es lohnt sich diese zu lernen (oder mindestens die Möglichkeit zu kennen das es dies gibt). Weil ich garantieren kann, dass Sie dies einmal benötigen – aber, wenn Write-Host benutzten wird es nicht funktionieren.

Benutzen Sie Write-Host niemals in Produktiven Code!

Wenn Write-Host fast immer das falsche Cmdlet ist, fragen Sie sich nun sicher wozu man es überhaupt benutzen sollte. Die Antwort ist fast immer.“Ich benutze Write-Host, wenn ich einen Code schreibe der NICHT als Skript abgespeichert wird.Write-host ist hier oft viel schneller und einfacher zu benutzen als andere Cmdlets. Für einen Skript Entwurf der wieder gelöscht wird kann man Write-Host auch einsetzen. Es nur wichtig das Skript wieder zu löschen oder Write-host in dem Skript zu ersetzen! Wenn Sie nicht beabsichtigen das Skript wieder zu löschen, sollten Sie Write-Host erst garnicht benutzen. Ich mache immer Skripte, die ich lösche oder überschreibe weil ich sie Test.PS1 genannt habe. Ein anderes Szenarium Write-Host zu benutzen ist, wenn Sie wirklich eine (farbige) Grafische Ausgabe erzeugen wollen.
Write-Host bietet eine Anzahl schöner Fähigkeiten um farbigen Text auszugeben. Dies ist großartig, wenn Sie wirklich beabsichtigen z.B. ein Diagramm in der Konsole oder einen Weihnachtsbaum oder „Space Invaders“ auszugeben ;-)

P.S.
Übrigens gilt fast dasselbe für die Format-xxx Cmdlets! Format-Custom,Format-List,Format-Table und Format-Wide.
Auch diese sind nicht gut für die Datenweitergabe geeignet! (Aber das benötigt einen eigenen Artikel)

Original Artikel von Jeffrey Snover:
http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/

Windows PowerShell Konsolen Diagramm:
http://jdhitsolutions.com/blog/2013/01/powershell-console-graphing-revised/

Windows PowerShell Space Invaders
http://ps1.soapyfrog.com/2007/01/02/space-invaders/

Windows PowerShell Weihnachtsbaum
http://www.powershell-group.eu/weihnachtsbaum-powershell/

The following two tabs change content below.
Profile photo of Peter Kriegel

Peter Kriegel

IT Professionell, SysAdmin
Ich arbeite mit Computern seit 1984 (Comodore Amiga war mein erster). Seit dem Jahr 1990 Programmiere ich in C,C++ und Basic Sprachen. Seit dem Jahr 2000 bin ich Computer Administrator. In diesem Jahr habe ich die Prüfungen für den Microsoft Certified System Administrator MCSA 2000 absolviert. Als System Administrator benutze ich VBScript ,DOS Batches, Office VBA. Seit 2005 Programmiere ich mit Visual Basic .NET (VB.NET) (.NET V2). Dort entwickle ich Datenbank-Bedienungsoberflächen für den Microsoft SQL Server (GUI Frontend). PowerShell benutze ich seit 2009. In einem sehr großen Active Directory (> 100000 Workstations) verwalte ich (und meine 9 Kollegen) ca. 3000 Windows Clients, die in 37 OUs geordnet sind.

Kommentar verfassen