You are on page 1of 9

THEMA

about_pipelines
KURZBESCHREIBUNG
Zusammenfassen von Befehlen in Pipelines in Windows PowerShell
DETAILBESCHREIBUNG
Eine Pipeline besteht aus einer Reihe von Befehlen, die durch
Pipelineoperatoren (|, ASCII 124) verbunden sind. Jeder
Pipelineoperator sendet die Ergebnisse des vorangehenden Befehls
an den nchsten Befehl.

ber Pipelines knnen Sie die von einem Befehl ausgegebenen
Objekte zur Verarbeitung als Eingabe an einen anderen Befehl
senden. Auch die Ausgabe dieses Befehls knnen Sie an einen
weiteren Befehl senden. Auf diese Weise verfgen Sie ber eine
sehr leistungsstarke Befehlskette oder "Pipeline", die aus einer
Reihe einfacher Befehle besteht.
Beispiel:
Befehl-1 | Befehl-2 | Befehl-3
In diesem Beispiel werden die von Befehl-1 ausgegebenen Objekte
an Befehl-2 gesendet. Befehl-2 verarbeitet die Objekte und sendet
sie an Befehl-3. Befehl-3 verarbeitet die Objekte und bergibt
sie ber die Pipeline. Da in der Pipeline keine weiteren Befehle
enthalten sind, wird das Ergebnis an der Konsole angezeigt.
In einer Pipeline werden die Befehle von links nach rechts in der
Reihenfolge verarbeitet, in der sie angezeigt werden. Die
Verarbeitung wird als einzelner Vorgang behandelt, und die
Ausgabe wird angezeigt, sobald sie generiert wurde.
Im Folgenden finden Sie ein einfaches Beispiel. Mit dem folgenden
Befehl wird der Editor-Prozess ab und dann beendet.
get-process notepad | stop-process
Im ersten Befehl wird mit dem Cmdlet "Get-Process" ein Objekt
abgerufen, das den Editor-Prozess darstellt. Mit einem
Pipelineoperator (|) wird das Prozessobjekt an das Cmdlet
"Stop-Process" gesendet, das den Editor-Prozess beendet. Der
Befehl "Stop-Process" enthlt keinen Namen oder ID-Parameter zum
Angeben des Prozesses, da der angegebene Prozess ber die
Pipeline bergeben wird.
Im Folgenden finden Sie ein praktisches Beispiel. Mit dieser
Befehlspipeline werden die Textdateien im aktuellen Verzeichnis
abgerufen, nur Dateien mit mehr als 10.000 Bytes Lnge
ausgewhlt, diese nach Lnge sortiert und anschlieend der Name
und die Lnge jeder Datei in einer Tabelle angezeigt.
Get-ChildItem -path *.txt | Where-Object {$_.length -gt 10000} |
Sort-Object -property Length | Format-Table -property name, length
Diese Pipeline besteht aus vier Befehlen in der angegebenen
Reihenfolge. Der Befehl wird horizontal geschrieben, doch wird
der Prozess in der folgenden Grafik vertikal dargestellt.
Get-ChildItem -path *.txt
|
| ( FileInfo-Objekte )
| ( .txt )
|
V
Where-Object {$_.length -gt 10000}
|
| ( FileInfo-Objekte )
| ( .txt )
| ( Length > 10000 )
|
V
Sort-Object -property Length
|
| ( FileInfo-Objekte )
| ( .txt )
| ( Length > 10000 )
| ( Nach Lnge sortiert )
|
V
Format-Table -property name, length
|
| ( FileInfo-Objekte )
| ( .txt )
| ( Length > 10000 )
| ( Nach Lnge sortiert )
| (Als Tabelle formatiert)
|
V
Name Length
---- ------
tmp1.txt 82920
tmp2.txt 114000
tmp3.txt 114000
VERWENDEN VON PIPELINES
Die Windows PowerShell-Cmdlets wurden fr die Verwendung in
Pipelines entwickelt. Beispielsweise knnen Sie die Ergebnisse
von Get-Cmdlet meist ber die Pipeline an ein Aktions-Cmdlet (z.
B. ein Set-, Start-, Stop- oder Rename-Cmdlet) mit demselben
Substantiv bergeben.
So knnen Sie ber die Pipeline einen beliebigen Dienst vom
Cmdlet "Get-Service" an das Cmdlet "Start-Service" oder
"Stop-Service" bergeben (jedoch knnen Sie auf diese Weise keine
deaktivierten Dienste erneut starten).
Mit der folgenden Befehlspipeline wird der WMI-Dienst auf dem
Computer gestartet:
get-service wmi | start-service
Die Cmdlets, mit denen Objekte der Windows PowerShell-Anbieter
abgerufen und festgelegt werden, z. B. die Item-Cmdlets und
ItemProperty-Cmdlets, wurden ebenfalls fr die Verwendung in
Pipelines entwickelt.
Beispielsweise knnen Sie die Ergebnisse des Befehls "Get-Item"
oder "Get-ChildItem" im Windows PowerShell-Registrierungsanbieter
ber die Pipeline an das Cmdlet "New-ItemProperty" bergeben. Mit
dem folgenden Befehl wird dem Schlssel "MeinUnternehmen" der
neue Registrierungseintrag "AnzMitarbeiter" mit dem Wert 8214
hinzugefgt.
get-item -path HKLM:\Software\MeinUnternehmen | new-Itemproperty -name An
zMitarbeiter -value 8124
Zahlreiche Dienstprogramm-Cmdlets, z. B. Get-Member,
Where-Object, Sort-Object, Group-Object und Measure-Object,
werden fast ausschlielich in Pipelines verwendet. An diese
Cmdlets knnen Sie beliebige Objekte ber die Pipeline bergeben.
Sie knnen Sie z. B. alle Prozesse auf dem Computer ber die
Pipeline an den Befehl "Sort-Object" bergeben und sie nach der
Anzahl der Handles im Prozess sortieren.
get-process | sort-object -property handles

Zudem knnen Sie smtliche Objekte ber die Pipeline an die
Formatierungs-Cmdlets, z. B. Format-List und Format-Table, die
Export-Cmdlets, z. B. Export-Clixml und Export-CSV, sowie die
Out-Cmdlets, z. B. Out-Printer, bergeben.
So knnen Sie den Prozess "Winlogon" ber die Pipeline an das
Cmdlet "Format-List" bergeben, um alle Eigenschaften des
Prozesses in einer Liste anzuzeigen.
get-process winlogon | format-list -property *
Mit einem bisschen bung werden Sie feststellen, dass Sie durch
Kombination einfacher Befehle in Pipelines Zeit und
Eingabeaufwand sparen und die Skripterstellung effizienter gestalten.
FUNKTIONSWEISE VON PIPELINES
Wenn Sie Objekte ber die Pipeline bergeben, d. h., die Objekte
in der Ausgabe eines Befehls an einen anderen Befehl senden,
versucht Windows PowerShell, die ber die Pipeline bergebenen
Objekte einem der Parameter des empfangenden Cmdlets zuzuordnen.
Dazu sucht die Parameterbindungskomponente von Windows
PowerShell, mit der Eingabeobjekte Cmdlet-Parametern zuordnet
werden, einen Parameter, der die folgenden Kriterien erfllt:

-- Der Parameter muss Eingaben von einer Pipeline akzeptieren
(dies trifft nicht auf alle zu).
-- Der Parameter muss den Typ des gesendeten Objekts oder einen
Typ akzeptieren, in den das Objekt konvertiert werden kann.
-- Der Parameter darf nicht bereits im Befehl verwendet werden.
Das Cmdlet "Start-Service" beispielsweise verfgt ber
zahlreiche Parameter, doch nur zwei von diesen, Name und
InputObject akzeptieren Pipelineeingaben. Der Name-Parameter
akzeptiert Zeichenfolgen, und der InputObject-Parameter
akzeptiert Dienstobjekte. Deshalb knnen Sie Zeichenfolgen und
Dienstobjekte (sowie Objekte mit Eigenschaften, die in
Zeichenfolgen- und Dienstobjekte konvertiert werden knnen) ber
die Pipeline an Start-Service bergeben.
Wenn die Parameterbindungskomponente von Windows PowerShell die
ber die Pipeline bergebenen Objekte keinem Parameter des
empfangenden Cmdlets zuordnen kann, kann der Befehl nicht
ausgefhrt werden, und Sie werden von Windows PowerShell
aufgefordert, die fehlenden Parameterwerte einzugeben.
Sie knnen nicht erzwingen, dass die Parameterbindungskomponente
die ber die Pipeline bergebenen Objekte einem bestimmten
Parameter zuordnet, Sie knnen nicht einmal einen Parameter
vorschlagen. Stattdessen verwaltet die Logik der Komponente den
Pipelinevorgang so effizient wie mglich.
EINZELVERARBEITUNG
Das bergeben von Objekten ber die Pipeline an einen Befehl
hnelt dem Senden von Objekten mit einem Parameter des Befehls.
Beispielsweise knnen Sie Objekte, die die Dienste auf dem
Computer darstellen, ber die Pipeline an den Befehl
"Format-Table" bergeben:
get-service | format-table -property name, dependentservices
Dies hnelt dem Speichern der Dienstobjekte in einer Variablen
und dem Senden des Dienstobjekts mit dem InputObject-Parameter
von Format-Table:
$services = get-service
format-table -inputobject $services -property name, dependents
ervices
Es hnelt auch dem Einbetten des Befehls im Parameterwert:
format-table -inputobject (get-service wmi) -property name, de
pendentservices
Jedoch besteht ein wichtiger Unterschied. Wenn Sie mehrere
Objekte ber die Pipeline an einen Befehl bergeben, sendet
Windows PowerShell die Objekte einzeln an den Befehl. Wenn Sie
einen Befehlsparameter verwenden, werden die Objekte als
einzelnes Arrayobjekt gesendet.
Dieser scheinbar technische Unterschied kann interessante und
manchmal ntzliche Folgen haben.
Wenn Sie z. B. mehrere Prozessobjekte vom Cmdlet "Get-Process"
ber die Pipeline an das Cmdlet "Get-Member" bergeben, sendet
Windows PowerShell jedes Prozessobjekt einzeln an Get-Member.
Get-Member zeigt die .NET-Klasse (den Typ) der Prozessobjekte
und deren Eigenschaften und Methoden an.
(Get-Member entfernt Duplikate, wenn alle Objekte vom gleichen
Typ sind, wird daher nur ein Objekttyp angezeigt.)
In diesem Fall zeigt Get-Member die Eigenschaften und Methoden
jedes Prozessobjekts an, d. h. ein System.Diagnostics.Process-Objekt.
get-process | get-member
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
Handles AliasProperty Handles = Handlec
ount
Name AliasProperty Name = ProcessNam
e
NPM AliasProperty NPM = NonpagedSys
temMemorySize
...
Wenn Sie jedoch den InputObject-Parameter von Get-Member
verwenden, empfngt Get-Member ein Array von System.Diagnostics.
Process-Objekten als einzelne Einheit, und es werden die
Eigenschaften eines Objektarrays angezeigt. (Beachten Sie das
Arraysymbol ([]) nach dem Typnamen von System.Object.)
get-member -inputobject (get-process)
TypeName: System.Object[]
Name MemberType Definition
---- ---------- ----------
Count AliasProperty Count = Length
Address Method System.Object& Address(Int32 )
Clone Method System.Object Clone()
...
Dies stellt mglicherweise nicht das von Ihnen beabsichtigte
Ergebnis dar, aber sobald Sie die Funktionsweise erkannt haben,
knnen Sie es problemlos verwenden. Ein Array von Prozessobjekten
verfgt beispielsweise ber eine Count-Eigenschaft, mit der Sie
die Anzahl der Prozesse auf dem Computer zhlen knnen.
(get-process).count

Dieser Unterschied kann wichtig sein, vergessen Sie daher nicht,
dass Objekte einzeln bermittelt werden, wenn Sie diese ber die
Pipeline an ein Cmdlet bergeben.
PIPELINEEINGABEN AKZEPTIEREN
Um Objekte in einer Pipeline zu empfangen, muss das empfangende
Cmdlet einen Parameter aufweisen, der Pipelineeingaben
akzeptiert. Sie knnen den Befehl "Get-Help" mit dem
Full-Parameter oder dem Parameter-Parameter verwenden, um ggf.
die Parameter eines Cmdlet zu bestimmen, die Pipelineeingaben
akzeptieren.
In der Standardanzeige von Get-Help wird das Element
"Pipelineeingaben akzeptieren" in einer Tabelle von
Parameterattributen angezeigt. Diese Tabelle wird nur angezeigt,
wenn Sie den Full-Parameter oder den Parameter-Parameter des
Cmdlet "Get-Help" verwenden.
Wenn Sie z. B. bestimmen mchten, welcher Parameter des Cmdlet
"Start-Service" Pipelineeingaben akzeptiert, geben Sie Folgendes ein:

get-help start-service -full
get-help start-service -parameter *
In der Hilfe fr das Cmdlet "Start-Service" wird z. B. angezeigt,
dass der Name-Parameter und der InputObject-Parameter
Pipelineeingaben akzeptieren. Alle anderen Parameter weisen in
der Zeile "Pipelineeingaben akzeptieren?" den Wert "False" auf.
-name <string[]>
Gibt die Dienstnamen fr die zu startenden Dienste an.
Der Parametername ist optional. Sie knnen "-Name" oder
den zugehrigen Alias "-ServiceName" verwenden oder aber
den Parameternamen auslassen.
Erforderlich? true
Position? 1
Standardwert
--> Pipelineeingaben akzeptieren? true (ByValue, ByPropertyName)
Platzhalterzeichen akzeptieren? true
-inputObject <ServiceController[]>
Gibt ServiceController-Objekte an, die die zu startenden
Dienste darstellen. Geben Sie eine Variable ein, die die
Objekte enthlt, oder geben Sie einen Befehl oder einen
Ausdruck ein, mit dem die Objekte abgerufen werden.
Erforderlich? false
Position? benannt
Standardwert
--> Pipelineeingaben akzeptieren? true (ByValue)
Platzhalterzeichen akzeptieren? false
Dies bedeutet, dass Sie Objekte (PsObjects) ber die Pipeline an
das Cmdlet "Where-Object" bergeben knnen und dieses von
Windows PowerShell dem InputObject-Parameter zugeordnet wird.
METHODEN ZUM AKZEPTIEREN VON PIPELINEEINGABEN
Parameter von Cmdlets knnen Pipelineeingaben mit zwei
verschiedenen Methoden akzeptieren:
-- ByValue: Parameter, die Eingaben "nach Wert" akzeptieren,
knnen ber die Pipeline bergebene Objekte mit dem gleichen
.NET-Typ wie die entsprechenden Parameterwerte oder Objekte
akzeptieren, die in diesen Typ konvertiert werden knnen.
Der Name-Parameter von Start-Service akzeptiert z. B.
Pipelineeingaben nach Wert. Er akzeptiert Zeichenfolgenobjekte
oder Objekte, die in Zeichenfolgen konvertiert werden knnen.
-- ByPropertyName: Parameter, die Eingaben "nach Eigenschaftenwert"
akzeptieren, knnen ber die Pipeline bergebene Objekte
nur akzeptieren, wenn eine Eigenschaft des Objekts denselben
Namen wie der Parameter besitzt.
Der Name-Parameter von Start-Service akzeptiert z. B. Objekte
mit einer Name-Eigenschaft.
(Zum Auflisten der Eigenschaften eines Objekts bergeben Sie
dieses ber die Pipeline an das Cmdlet "Get-Member".)
Einige Parameter akzeptieren Objekte nach Wert oder nach
Eigenschaftennamen. Diese Parameter wurden so entworfen, dass
sie Eingaben von der Pipeline problemlos akzeptieren.
ERMITTELN VON PIPELINEFEHLERN
Wenn ein Befehl aufgrund eines Pipelinefehlers nicht
ordnungsgem ausgefhrt wird, knnen Sie den Fehler untersuchen
und den Befehl umschreiben.
Mit dem folgenden Befehl wird z. B. versucht, einen
Registrierungseintrag aus einem Registrierungsschlssel in einen
anderen zu verschieben, indem mit dem Cmdlet "Get-Item" der
Zielpfad abgerufen und dann der Pfad ber die Pipeline an das
Cmdlet "Move-ItemProperty" bergeben wird.
Genauer gesagt wird in diesem Befehl mit dem Cmdlet "Get-Item"
der Zielpfad abgerufen. Das Ergebnis wird mit einem
Pipelineoperator an das Cmdlet "Move-ItemProperty" gesendet. Mit
dem Befehl "Move-ItemProperty" werden der aktuelle Pfad und der
Name des zu verschiebenden Registrierungseintrags angegeben.
get-item -path hklm:\software\meinunternehmen\vertrieb |
move-itemproperty -path hklm:\software\meinunternehmen\design -name pr
odukt
Der Befehl wird nicht ordnungsgem ausgefhrt, und von Windows
PowerShell wird die folgende Fehlermeldung angezeigt:
Move-ItemProperty: Das Eingabeobjekt kann nicht an die
Parameter fr den Befehl gebunden werden, da der Befehl
keine Pipelineeingaben akzeptiert oder die Eingabe und deren
Eigenschaften mit keinem Parameter bereinstimmen, der
Pipelineeingaben akzeptiert.
Bei Zeile:1 Zeichen:23
+ $a | move-itemproperty <<<< -path hklm:\software\meinunternehmen\desi
gn -name produkt
Wenn Sie eine berprfung ausfhren mchten, verwenden Sie das
Cmdlet "Trace-Command", um die Komponente ParameterBinding von
Windows PowerShell nachzuverfolgen. Mit dem folgenden Befehl wird
die Komponente "ParameterBinding" whrend der Befehlsverarbeitung
nachverfolgt. Mit dem -phost-Parameter werden die Ergebnisse an
der Konsole angezeigt, und mit dem -filepath-Parameter werden
diese zur spteren Referenz an die Datei "debug.txt" gesendet.
trace-command -name parameterbinding -expression {get-item -path hklm:\
software\meinunternehmen\vertrieb |
move-itemproperty -path hklm:\software\meinunternehmen\design -name pr
odukt} -pshost -filepath debug.txt
Die Ergebnisse der Ablaufverfolgung sind umfangreich, doch zeigen
diese die an das Cmdlet "Get-Item" gebundenen Werte und dann die
benannten Werte, die an das Cmdlet "Move-ItemProperty" gebunden sind.
...
BIND NAMED cmd line args [Move-ItemProperty]
BIND arg [hklm:\software\meinunternehmen\design] to parameter [Pfad]

...
BIND arg [produkt] to parameter [Name]
....
BIND POSITIONAL cmd line args [Move-ItemProperty]
...
Schlielich wird gezeigt, dass der Versuch, den Pfad an den
Destination-Parameter von Move-ItemProperty zu binden, nicht
erfolgreich war.
...
BIND PIPELINE object to parameters: [Move-ItemProperty]
PIPELINE object TYPE = [Microsoft.Win32.RegistryKey]
RESTORING pipeline parameter's original values Parameter
[Destination] PIPELINE INPUT ValueFromPipelineByPropertyName
NO COERCION Parameter [Credential] PIPELINE INPUT
ValueFromPipelineByPropertyName NO COERCION
...
Zum Untersuchen des Fehlers zeigen Sie mit dem Cmdlet "Get-Help"
die Attribute des Destination-Parameters an. Mit dem folgenden
Befehl rufen Sie ausfhrliche Informationen zum Destination-
Parameter ab.
get-help move-itemproperty -parameter destination
Die Ergebnisse zeigen, dass Destination Pipelineeingaben nur
"nach Eigenschaftennamen" akzeptiert.
Das ber die Pipeline bergebene Objekt muss daher die
Destination-Eigenschaft besitzen.
-destination <Zeichenfolge>
Gibt den Pfad zum Zielspeicherort an.
Erforderlich? true
Position? 2
Standardwert
Pipelineeingaben akzeptieren? true (ByPropertyName)
Platzhalterzeichen akzeptieren? true
Um alle Eigenschaften des ber die Pipeline an das Cmdlet
"Move-ItemProperty" bergebenen Objekts anzuzeigen, bergeben
Sie es ber die Pipeline an das Cmdlet "Get-Member". Im
folgenden Befehl werden die Ergebnisse des ersten Befehlsteils
ber die Pipeline an das Cmdlet "Get-Member" bergeben.
get-item -path hklm:\software\meinunternehmen\vertrieb | get-member
Die Ausgabe zeigt, dass es sich bei dem Element um ein
Microsoft.Win32.RegistryKey handelt, der keine Destination-Eigen-
schaft besitzt. Dies erklrt das Fehlschlagen des Befehls.
Zum Korrigieren des Befehls muss das Ziel im Cmdlet
"Move-ItemProperty" angegeben werden. Mit dem Befehl
"Get-ItemProperty" knnen Sie den Pfad abrufen, jedoch mssen
der Name und das Ziel im Move-ItemProperty-Teil des Befehls
angegeben werden.

get-item -path hklm:\software\meinunternehmen\design |
move-itemproperty -dest hklm:\software\meinunternehmen\design -name
produkt
Um die ordnungsgeme Funktion des Befehls zu berprfen,
verwenden Sie den Befehl "Get-ItemProperty":
get-itemproperty hklm:\software\meinunternehmen\vertrieb
Die Ergebnisse zeigen, dass der Registrierungseintrag "Produkt"
in den Schlssel "Vertrieb" verschoben wurde.
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\so
ftware\meinun ternehmen\vertrieb
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\so
ftware\meinun ternehmen
PSChildName : vertrieb
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
Produkt : 18
SIEHE AUCH
about_objects
about_parameters
about_command_syntax
about_foreach