Verwenden Sie in diesem Beispiel die PowerShell-Pipeline

Eines der Sprachkonstrukte, die Windows PowerShell einzigartig machen, ist die Pipeline.

Obwohl die Pipeline lange Zeit ein Grundnahrungsmittel für verschiedene Shells war, verbesserte PowerShell das traditionelle Konzept, indem es dem Scripter ermöglichte, Objekte anstelle einfacher Textzeichenfolgen zu übergeben. PowerShell bietet Hunderte von Cmdlets gebaut, um die Pipeline zu unterstützen. Indem Sie benutzerdefinierte Funktionen auf eine bestimmte Weise erstellen, können Sie Befehle erstellen, die die PowerShell-Pipeline unterstützen.

Sobald Sie diese Beispiele der Pipeline in Aktion sehen, erfahren Sie, wie Sie PowerShell-Pipelinekonstrukte integrieren in Ihre Funktionen.

In der alten Windows-Eingabeaufforderung war das Konzept einer Pipeline erforderlich STDOUT Ausgabe und Verrohrung direkt in STDIN Eingang. Ein typischer Rohrleitungsszenario Dies ist der Fall, wenn Sie eine Dateiliste aus einem Ordner mit vielen Dateien abrufen und diese durchblättern müssen. Die Paging-Funktion wird von der ausgeführt Mehr Befehl. Das Mehr Der Befehl akzeptiert Pipeline-Eingaben. Wenn ich also eine Datei mit jeweils einer Seite erhalten möchte, kann ich die Ausgabe von senden dir direkt zu mehr: dir C: | Mehr.

Nicht alle Befehle unterstützen die Eingabe auf diese Weise, und Microsoft hat die Eingabeaufforderung im Gegensatz zu PowerShell nicht so konzipiert, dass sie viel mehr als dies ermöglicht. Power Shell hat native Unterstützung für Pipelining. Zum Beispiel möchten Sie vielleicht alle laufenden Prozesse auf einem Computer abrufen. Du kannst den … benutzen Get-Prozess Cmdlet selbst (siehe Abbildung 1).

PowerShell Get-Process-Ausgabe.
Abbildung 1. Dieses Ergebnis stammt aus dem Cmdlet Get-Process in PowerShell.

Um nur den Prozessnamen anzuzeigen, können Sie die Ausgabe von weiterleiten Get-Prozess direkt zu einem anderen Befehl; Objekt auswählen (siehe Abbildung 2). Sie können Setzen Sie diesen Prozess unendlich fort mit PowerShell-Pipelines (siehe Abbildung 3).

Select-Object mit Get-Process in PowerShell.
Abbildung 2. Mit einer PowerShell-Pipeline kann der Benutzer nur Prozessnamen aus der Get-Process-Ausgabe anzeigen.
Dateisammlung Get-Process mit Select-Object in PowerShell.
Abbildung 3. Die Ausgabe von Get-Process mit Select-Object wird direkt in eine Datei geleitet und zeigt die ersten zehn Inhaltszeilen an.

Mit zusätzlichem Aufwand kann eine PowerShell-Pipeline gestartet werden jenseits dieser eingebauten Befehle um benutzerdefinierte Funktionen einzuschließen, die in PowerShell erstellt wurden. Der Administrator muss einige Parameterattribute verwenden, die aufgerufen werden ValueFromPipeline und ValueFromPipelineByPropertyName. Diese beiden Attribute, die verschiedenen Parametern in Ihrer Funktion zugeordnet sind, ermöglichen es ihr, Eingaben direkt aus der Pipeline zu übernehmen und die Parameterwerte innerhalb der Funktion zu verwenden. Obwohl ähnlich, verhält sich jedes Attribut etwas anders.

Indem Sie benutzerdefinierte Funktionen auf eine bestimmte Weise erstellen, können Sie Befehle erstellen, die die PowerShell-Pipeline unterstützen.

Mit dem ValueFromPipeline Attribut können wir das verwenden Get-Prozess Beispiel noch einmal: Erweitern Sie es auf eine benutzerdefinierte Funktion, die die Prozessobjekte übernimmt, die Get-Prozess Ausgänge als Eingang.

Eine einfache erweiterte Funktion könnte folgendermaßen aussehen:

Funktion Test-Prozess

{

[CmdletBinding()]

param

((

[Parameter()]

[string]$ ProcessName

)

if ((Get-Process -Name $ ProcessName) .Responding -eq $ True)

{

$ true

}}

sonst

{

$ false

}}

}}

Mit dieser Funktion kann das System einen Prozess anhand seines Namens angeben, auf eine bestimmte Eigenschaft testen und zurückgeben $ true oder $ false. Es funktioniert, verdoppelt jedoch den Aufwand aufgrund der Art und Weise, wie es dargestellt wird. Eine andere Methode wäre, die Funktion zu verwenden, um für jeden Prozess auf Ihrem Computer ausgeführt zu werden:

Get-Process | ForEach-Object {Test-Process –ProcessName $ _. Name}

Das ist immer noch nicht sehr effizient. Du rennst Get-Prozess zweimal für jedes Objekt. Es wäre viel besser, einfach die Ausgabe von zu senden Get-Prozess direkt zu Testprozess ohne verwenden zu müssen Für jedes Objekt.

Erstellen wir stattdessen eine Funktion zur Unterstützung der PowerShell-Pipeline-Eingabe, indem wir jedes Objekt akzeptieren, das Get-Prozess Ausgänge. Ein Beispiel für diese benutzerdefinierte Funktion folgt:

Funktion Test-Prozess

{

[CmdletBinding()]

param

((

[Parameter(ValueFromPipeline)]

[System.Diagnostics.Process]$ Prozess

)

Prozess

{

if ($ Process.Responding -eq $ True)

{

$ true

}}

sonst

{

$ false

}}

}}

}}

Zum Schluss leiten Sie die Ausgabe von direkt weiter Get-Prozess in Test-Prozess: Get-Prozess | Testprozess.

Es gibt einige deutliche Änderungen. Zuerst die ValueFromPipeline Das Parameterattribut befindet sich in der Klammer der Parameterdeklaration. Dadurch wird PowerShell angewiesen, ganze Objekte zu betrachten, die aus der Pipeline eingehen, und zu versuchen, jedes Objekt diesem Parameter zuzuordnen. Als nächstes ändert sich der Typ von Zeichenfolge zu System.Diagnostics.Process. Durch diese Änderung kann der Parametertyp mit dem Ausgabeobjekttyp von übereinstimmen Get-Prozess Der Befehl wird also erfolgreich ausgeführt.

Abbildung 4 zeigt die Verwendung Get-Member um den Objekttyp zu finden, der Get-Prozess Ausgänge.

PowerShell mit Get-Process und Get-Member
Abbildung 4. In einer PowerShell-Pipeline findet Get-Member den Objekttyp, der von Get-Process ausgegeben wird.

Um jedes aus der PowerShell-Pipeline eingehende Objekt zu verarbeiten, muss die Funktion einen Prozessblock enthalten. Ohne ein Prozessblock-Skript würde die Funktion nach der Verarbeitung des ersten Objekts beendet.

Und schließlich, weil der Befehl das gesamte akzeptiert System.Diagnostics.Process Objekt Anstelle nur des Prozessnamens werden alle Eigenschaften verfügbar gemacht. Der PowerShell-Benutzer kann einfach den Wert der antwortenden Eigenschaft aus dem lesen $ Prozessparameter ohne anrufen zu müssen Get-Prozess nochmal.

Da sind mehr ausführliche Tipps Erhältlich bei Experten wie Boe Prox zur Unterstützung von Pipelines, die Ihnen beim Erstellen von Funktionen zur Verwendung der Pipeline helfen ValueFromPipeline Parameterattribut und auch die ValueFromPipelineByPropertyName Attribut.

Leave a Reply