Objekt-Pipelining
Eintrag zuletzt aktualisiert am: 26.06.2019
Objekt-Pipelining ist ein Konzept der Microsoft PowerShell zum Austausch von typisierten Objekten zwischen Befehlen (
Commandlets). Das objektorientierte Pipelining ist im Gegensatz zum in den Unix-Shell verwendeten zeichenkettenbasierten Pipelining nicht abhängig von der Position der Informationen in der
Pipeline. Für eine
Pipeline wird in der PowerShell – wie auch unter Unix üblich – der vertikale Strich (|) verwendet.
PowerShell
Pipeline Processor reicht Objekt von Upstream- zu Downstream-Objekt weiter.
Beispiele
Get-Process | Where-Object { $_.name -eq "iexplore" } | Format-Table ProcessName, WorkingSet
get-childitem c:\daten -filter *.dll | where-object {$_.Length -gt 40000 | sort-object Lengt| format-list
Get-Alias | where { $_.definition -match "get-process" }
Weitere Informationen
Seine Mächtigkeit entfaltet die PowerShell erst durch das Pipelining, also durch die Weitergabe von Daten von einem
Commandlet zum anderen.
Objektorientierung ist die herausragende Eigenschaft der
Windows PowerShell:
Commandlets können durch
Pipelines mit anderen
Commandlets verbunden werden. Anders als
Pipelines in Unix-Shell tauschen die einzelnen Befehle keine Zeichenketten, sondern typisierte
.NET-Objekte aus.
Die
Liste der laufenden Dienste erhält man mit dem Befehl
Get-Service | Where-Object {$_.status –eq "running"}
Die
Liste der gestoppten Dienste liefert dementsprechend
Get-Service | Where-Object {$_.status –eq "stopped"}
Eine
Pipeline kann beliebig lang sein. Der nächste Befehl exportiert die
Liste der Namen der gestarteten Dienste in einer
CSV-Datei:
Get-Service | Where-Object {$
.status -eq "running"} | select-object Name, DisplayName s | export-csv j:\wipkolumne\dienste.csv
Get-Service legt
.NET-Objekte des Typs System
System.ServiceProcess.ServiceController in die
Pipeline. Status Name und DisplayName sind
Attribute dieser
.NET-Klasse. Where-Object filtert Objekte in der
Pipeline. Select-Object beschneidet die einzelnen Objekte in der
Pipeline, sodass nur noch die beiden Namen übrig bleiben. Sinnvoll zur Schonung der CPU-Belastung ist die obige Reihenfolge von Where-Object und Select-Object (stärkste Einschränkung zuerst). Aber auch die umgekehrte Reihenfolge ist möglich und würde zum gleichen Ergebnis führen.
get-process | format-list
bedeutet, dass das Ergebnis der get-process-Operation an format-list weitergegeben werden soll. Die Standardausgabeform von get-process ist eine Tabelle. Durch format-list werden die einzelnen
Attribute der aufzulistenden
Prozesse untereinander statt in Spalten ausgegeben. Ein Beispiel für eine komplexere
Pipeline ist:
get-children c:\daten -filter *.dll
| where-object "Length -gt 40000
| sort-object Length
| format-list
get-children ermittelt alle Dateien in c:\daten. Durch das zweite
Commandlet (where-object) wird die Ergebnismenge auf diejenigen Objekte beschränkt, bei denen das
Attribut Length größer ist als 40000. Durch das dritte
Commandlet in der
Pipeline wird die Ausgabe nach dem
Attribut Length sortiert. Mit dem letzten
Commandlet schließlich wird eine
Listendarstellung erzwungen.
Im Gegensatz zu klassischen Shell-
Pipelines tauscht die PowerShell keine Zeichenketten zwischen den Befehlen aus, sondern
.NET-Objekte, die durch
Reflection analysiert werden. Genau genommen bezeichnet Microsoft das Verfahren als "Extended
Reflection", weil die PowerShell erhebliche Hilfe beim Analysieren der Eingabeobjekte leistet. Für die Übergabe der
.NET-Objekte an die
Commandlets sorgt der PowerShell
Pipeline Processor. Die Basisklasse
Cmdlet stellt den einzelnen
Commandlet-Klassen eine Reihe von
Datenstrukturen und
Methoden zur Verfügung, die den einzelnen
Commandlets das Handling der Input- und Output-
Pipeline vereinfacht. Die von Microsoft vordefinierten Befehle liefern sowohl Objekte aus der
.NET-Klassenbibliothek als auch
WMI-Objekte.
Die Reihenfolge der einzelnen Befehle in der
Pipeline ist dabei nicht beliebig. Keineswegs kann man im obigen Befehl die Sortierung hinter die Formatierung setzen, weil nach dem Formatieren zwar noch ein Objekt existiert, dies aber ein unstrukturierter und untypisierter Ausgabestrom ist. where-object und sort-object könnte man vertauschen; aus Gründen des Ressourcenverbrauchs sollte man aber erst einschränken und dann die verringerte
Liste sortieren. Die Anzahl der Befehle in einer einzigen
Pipeline ist nicht begrenzt. Mehrere
Commandlets in einer
Pipeline können parallel durch die PowerShell ausgeführt werden, da ein einzelnes
Commandlet bereits Daten senden darf, auch wenn es noch nicht alle Daten des vorherigen Befehls empfangen hat. Ein
Commandlet wird sofort aufgerufen, sobald das erste Objekt bereitsteht.
Tipp
Den Inhalt der
Pipeline kann man übrigens mit dem
Commandlet get-member analysieren.