Wie funktioniert das PowerShell-Pipeline-Konzept?

8

Ich verstehe, dass das PowerShell-Pipeting funktioniert, indem die Ausgabe eines Cmdlets als Eingabe an ein anderes Cmdlet übergeben wird. Aber wie geht es dabei?

Beendet das erste Cmdlet und übergibt dann alle Ausgabevariablen gleichzeitig, die dann von dem nächsten Cmdlet verarbeitet werden?

Oder wird jede Ausgabe des ersten Cmdlets einzeln ausgeführt und dann durch alle verbleibenden Piped-Cmdlets ausgeführt?

    
Richard 26.06.2013, 15:33
quelle

3 Antworten

10

Sie können sehen, wie die Pipeline-Reihenfolge mit einem einfachen Skript funktioniert:

%Vor%

Ausgaben:

%Vor%     
Keith Hill 26.06.2013, 20:29
quelle
5

Powershell-Pipe funktioniert auf asynchrone Weise. Das bedeutet, dass die Ausgabe des ersten Cmdlet für das zweite Cmdlet sofort für ein Objekt zu der Zeit verfügbar ist (auch wenn das erste Cmdlet nicht ausgeführt wurde).

Wenn Sie beispielsweise die folgende Zeile ausführen:

%Vor%

und stoppen Sie die Ausführung durch Drücken von Strg + C Sie sehen, dass ein Teil des Verzeichnisses in die Textdatei geschrieben wird.

Ein besseres Beispiel ist der folgende Code: (was in der Tat nützlich ist, um alle. tmp-Dateien auf Laufwerk c: zu löschen):

%Vor%

Jedes Mal, wenn $ _ im zweiten Cmdlet den Wert einer (einzelnen Datei) erhält

    
S Nash 26.06.2013 15:56
quelle
1

Beide Antworten geben Ihnen bisher einige gute Informationen über Pipelining. Aber es gibt noch mehr zu sagen.

Um Ihre Frage direkt anzusprechen, haben Sie zwei mögliche Wege vorgeschlagen, wie die Pipeline funktionieren könnte. Und sie haben beide recht ... abhängig von den Cmdlets auf beiden Seiten der Pipe! Die Art und Weise, wie die Pipeline funktioniert sollte jedoch näher an Ihrer zweiten Vorstellung sein: Objekte werden nacheinander verarbeitet. (Obwohl es keine Garantie gibt, dass ein Objekt den ganzen Weg durchläuft, bevor der nächste gestartet wird, da jede Komponente in der Pipeline asynchron ist, wie S Nash bereits erwähnt hat.)

Also was meine ich mit "hängt es von Ihren Cmdlets ab"? Wenn Sie über von Microsoft bereitgestellte Cmdlets sprechen, arbeiten sie wahrscheinlich alle so, wie Sie es erwarten würden, indem Sie jedes Objekt so effizient wie möglich durch die Pipeline leiten. Aber wenn Sie über Cmdlets sprechen, die Sie schreiben, hängt es davon ab, wie Sie sie schreiben: Es ist genauso einfach, Cmdlets zu schreiben, die das richtige Pipelining nicht ausführen, als solche, die erfolgreich sind!

Es gibt zwei prinzipielle Fehlerarten:

  • erzeugt alle Ausgaben, bevor sie in die Pipeline gesendet werden, oder
  • sammelt alle Pipeline-Eingaben, bevor sie verarbeitet werden.

Was Sie natürlich anstreben wollen, ist, jede Eingabe zu verarbeiten, sobald sie empfangen wird, und ihre Ausgabe auszugeben, sobald sie bestimmt wird. Für detaillierte Beispiele von all diesen finden Sie in meinem Artikel Ins und Outs der PowerShell-Pipeline , gerade auf Simple-Talk.com veröffentlicht.

    
Michael Sorens 07.11.2015 00:55
quelle

Tags und Links