Formatierung und Filterung
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.