Formatierung und Filterung

Abgeschlossen

Wenn Sie mit PowerShell arbeiten, ist es aus unterschiedlichen Gründen wichtig, dass Sie das Filtern und Formatieren verstehen. Zum einen sollte Ihre Pipeline natürlich die gewünschten Ergebnisse erzielen. Zum anderen sollte dies so effizient wie möglich geschehen, sowohl hinsichtlich der Art, wie Sie Daten über das Netzwerk pullen, als auch in Bezug darauf, wie Sie sicherstellen, dass Sie mit dem Ergebnis arbeiten können.

Linksfiltern

In einer Pipelineanweisung bedeutet Linksfiltern, dass nach den Ergebnissen gefiltert wird, die so früh wie möglich angezeigt werden sollen. In diesem Zusammenhang bedeutet linksfrüh, weil PowerShell Anweisungen von links nach rechts ausführt. Die Gedanke dahinter ist, die Anweisung schnell und effizient zu gestalten, indem sichergestellt wird, dass das Dataset, mit dem gearbeitet wird, so klein wie möglich ist. Dieses Prinzip kommt besonders zum Tragen, wenn Ihre Befehle für größere Datenspeicher ausgeführt werden oder Sie Ergebnisse über das Netzwerk abrufen.

Betrachten Sie folgende Anweisung:

Get-Process | Select-Object Name | Where-Object Name -eq 'name-of-process'

Mit dieser Anweisung werden zunächst alle Prozesse auf dem Computer abgerufen. Zum Schluss wird die Antwort formatiert, sodass nur die Name-Eigenschaft aufgeführt wird. Diese Anweisung folgt nicht dem Prinzip des Linksfilterns, da sie für alle Prozesse gilt, versucht, die Antwort zu formatieren und erst am Schluss filtert.

Es ist besser, zuerst zu filtern und anschließend zu formatieren, so wie in der folgenden Anweisung.

Get-Process | Where-Object Name -eq 'name-of-process' | Select-Object Name

Häufig ist ein Cmdlet, das Filter bietet, effizienter als die Verwendung von Where-Object. Im Folgenden wird eine effizientere Version der vorangehenden Anweisung gezeigt:

Get-Process -Name 'name-of-process' | Select-Object Name

In dieser Version übernimmt der Parameter -Name das Filtern für Sie.

Richtig formatieren – Formatierung kommt als Letztes

Beim Linksfiltern wird etwas so früh wie möglich in einer Anweisung gefiltert. Beim Rechtsformatieren wird entsprechend erst so spät wie möglich in einer Anweisung formatiert. Ok, aber warum muss ich spät formatieren? Die Antwort ist, dass Formatierungsbefehle die Struktur des Objekts mit den Ergebnissen verändern, sodass sich Ihre Daten nicht mehr in denselben Eigenschaften befinden. Diese Änderung beeinträchtigt die Fähigkeit zum Abrufen der gewünschten Informationen mithilfe von Pipebefehlen (Select-Object) oder über das Durchlaufen des Objekts mit einer foreach-Schleife.

Die Formatierung zerstört das Objekt, mit dem Sie sich beschäftigen. Nehmen Sie beispielsweise folgenden Aufruf:

Get-Process 'some process' | Select-Object Name, CPU | Get-Member

Der Typ, den Sie zurückbekommen, ist System.Diagnostics.Process. Fügen Sie nun wie folgt den Formatierer Format-Table hinzu:

Get-Process 'some process' | Format-Table Name,CPU | Get-Member

Wenn Sie sich nur auf die zurückgegebenen Typen konzentrieren, stellen Sie fest, dass Sie etwas anderes zurückerhalten:

TypeName: Microsoft.PowerShell.Commands.Internal.Format.FormatStartData
TypeName: Microsoft.PowerShell.Commands.Internal.Format.GroupStartData
TypeName: Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData
TypeName: Microsoft.PowerShell.Commands.Internal.Format.GroupEndData

Um welche Typen es sich dabei handelt, ist für diese Lerneinheit nicht von Bedeutung. Wichtig zu beachten ist, dass Ihre Daten anders ausfallen, wenn Sie einen beliebigen Formatierungsbefehl verwenden. In diesem Fall enthalten sie möglicherweise nicht mehr die Spalten, die Ihnen wichtig sind. Veranschaulichen wir dies anhand eines Beispiels:

Get-Process 'some process' | Select-Object Name, Cpu

Der vorangehende Befehl liefert Ihnen ein Ergebnis mit den Spalten Name und CPU.

Name       CPU
----       ---
zsh  1.2984395
zsh  0.2522047
zsh  0.2486375
zsh  0.2683466
zsh  0.2681874
zsh  1.6799438
zsh  0.2909816
zsh  0.7855272

Verwenden wir nun zuerst die Formatierung und dann Select-Object, um zu veranschaulichen, was passieren kann, wenn Sie nicht zum Schluss formatieren:

Get-Process 'some process' | Format-Table Name,CPU | Select-Object Name, CPU

Das Ergebnis sieht nun so aus:

Name CPU
---- ---

Es ist leer, weil das Objekt mit Ihren Ergebnissen durch die Platzierung von Daten in anderen Eigenschaften durch Format-Table transformiert wurde. Ihre Daten sind nicht verschwunden, nur Ihre Eigenschaften. Der vorangehende PowerShell-Befehl versucht, die Eigenschaften zu ermitteln, ist aber dazu nicht in der Lage.

Formatierungsbefehle sollten in Ihrer Anweisung an letzter Stelle stehen, da sie darauf abzielen, die Daten für die Bildschirmdarstellung ansprechend zu formatieren. Sie sind nicht dazu gedacht, Ihre Daten zu filtern oder zu sortieren.

Formatierungsbefehle

Die häufigsten Cmdlets zum Formatieren Ihrer Ausgabe sind Format-Table und Format-List. Standardmäßig formatieren die meisten Cmdlets die Ausgabe als Tabelle. Wenn Ihre Ausgabe Eigenschaften nicht in Spalten anzeigen soll, verwenden Sie das Cmdlet Format-List, um sie als Liste zu formatieren.