Tipps

Powershell Ausgabeströme verstehen und umleiten

"Ein Überblick darüber, wie Powershell Daten ausgibt, und wie sie dieses Verhalten steuern können. Wenn Sie in Powershell Daten an der Konsole ausgeben wollen, stehen Ihnen eine ganze Reihe von Commandlets zur Verfügung. Die wichtigsten sind:

  • Write-Output
  • Write-Error
  • Write-Warning
  • Write-Verbose
  • Write-Debug

Außerdem gibt es noch das gerne genutzte, aber leider böse Write-Host. Warum Write-Host böse ist, werden Sie gleich verstehen. Die 5 vorgestellten Commandlets haben alle eigene ""Ausgabeströme"" oder Kanäle, in denen die Daten ausgegeben werden. Man kann sich das vorstellen wie 5 parallele Straßen, auf denen der Verkehr geregelt wird. Die Linke Spur ist für LKW vorgesehen, die 2. Spur für Busse, die 3. für Taxen, die 4. für normalen Personenverkehr und die 5. für Einsatzfahrzeugt. Normalerweise sind die Spuren komplett voneinander getrennt, kommen sich also nicht in Gehege. Der normale Ausgabestrom wird auch von der Pipeline genutzt. Daten, die mit Write-Output in den Ausgabestrom geschrieben werden, landen in der Pipeline und können dort weiterverarbeitet werden. Alle anderen Ausgaben (Fehler, Debugmeldungen usw.) landen nicht in der Pipeline, da die Pipeline nur am Standard-Ausgabestrom hängt. Dadurch können alle in der Pipeline nicht benötigten Daten aus Ihr heraus gehalten werden. Genau wie auf einer Straße die Spuren gewechselt werden können, kann man in der Powershell auch Daten umleiten. Dafür gibt es den Umleitungsoperator >&. Vor dem > steht der Strom, der umgeleitet werden soll, hinter dem & steht der Strom, auf den umgeleitet werden soll. Die Ströme sind eindeutig durchnummeriert: 1 Output 2 Error 3 Warning 4 Verbose 5 Debug Das Kommando

$VerboseMessage = Write-Verbose -message "Dies ist eine Ausgabe" -verbose 4>&1

schreibt die Ausgabe des Write-Verbose-Befehls in eine Variable. Geben Sie nur

$VerboseMessage = Write-Verbose -message "Dies ist eine Ausgabe" -verbose

ohne den Umleitungsoperator an, wird die Nachricht ausgegeben, aber nicht in der Variablen gespeichert. (Der Parameter -verbose ist übrigens dafür da, ausführliche Nachrichten überhaupt erst auszugeben. Write-Verbose Ausgaben werden nur angezeigt, wenn die Variable $VerbosePreference auf Stop, Inquire oder Continue gesetzt ist, oder im Commandlet explizit der Parameter -verbose gesetzt wurde.) Das die Ausgabe nur mit dem Zuweisungsoperator 4>&1 gespeichert wird, liegt daran, dass in Variablen immer nur der Standard-Ausgabestrom gespeichert wird. Dadurch werde Fehlermeldungen usw. aus den Variablen heraus gehalten. Wollen Sie alle Ausgaben in eine Datei speichern, so hilft Ihnen die Umleitung *> c:\outputfile.txt Diese Ausgabe leitet sämtliche Ausagen in die Zieldatei um. Aber dummerweise nicht die Ausgaben, die write-host generiert. Write-Host nutzt nämlich keinen der Ausgabeströme, sondern schreibt direkt in die Konsole. Dadurch geht sämliche Kontrolle über die Ausgabe verloren. Nutzen Sie daher am Besten, soweit möglich, immer write-output für Ihre Ausgaben. "


 87,    02  Apr  2018 ,   Tipp
Holger Voges

  E-Mail Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!

Holger Voges ist Inhaber der Firma Netz-Weise IT-Training und seit 1999 als Trainer und Consultant tätig. Als Allrounder in den Bereichen Windows Server, Active Directory, SQL Server, Hyper-V und Windows PowerShell, hat er in der Vergangenheit zahlreiche Einsätze als Consultant in namenhaften Firmen absolviert und so neben der Theorie auch umfangreiche praktische Erfahrungen gesammelt.

 

Netz-Weise

Das Haupt-Tätigkeitsfeld von Netz-Weise sind Schulungen für Profis. Bei uns bekommen Sie das Programm für den fortgeschrittenen Praktiker, der die Tiefen des Systems ausloten möchte genauso wie Standard-Schulungen.

So erreichen Sie uns:

Netz-Weise
IT-Training und Beratung
Freundallee 13a
30173 Hannover
 
Tel: (0511) 165 925-0
Fax: (0511) 165 925-99
email: info(at)netz-weise.de
 

Newsletter bestellen

Das Wichtigste kompakt ins E-Mailfach!