Auswählen von Daten
Die Ausführung eines Befehls kann sehr leistungsfähig sein, da Sie Daten von Ihrem lokalen Computer oder aus dem Netzwerk abrufen können. Um noch effektiver zu werden, müssen Sie lernen, wie Sie die gewünschten Daten abrufen. Die meisten Befehle arbeiten mit Objekten – als Eingabe, Ausgabe oder beides. Objekte verfügen über Eigenschaften, und Sie möchten vielleicht auf eine Teilmenge dieser Eigenschaften zugreifen, um sie z. B. in einem Bericht darzustellen. Möglicherweise möchten Sie die Daten auch nach einer oder mehreren Eigenschaften sortieren. Aber wie gelangen Sie dorthin?
Verwenden von „Get-Member“ zum Untersuchen der Ausgabe
Wenn Sie die Ergebnisse eines Befehls an Get-Member
übergeben, gibt Get-Member
Informationen zu einem Objekt zurück, z. B.:
- Den Typ des an „Get-Member“ übergebenen Objekts.
- Die Eigenschaften des Objekts, das ausgewertet werden kann.
- Die Methoden des Objekts, das ausgeführt werden kann.
Veranschaulichen wir dies, indem wir Get-Member
mit dem Befehl Get-Process
ausführen.
Get-Process | Get-Member
Beachten Sie, wie Sie den senkrechten Strich |
verwenden und dass Sie durch Aufrufen von Get-Member
de facto bereits eine Pipeline erstellen. Die ersten Zeilen der Ausgabe der vorherigen Anweisung sehen so aus:
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
Handles AliasProperty Handles = Handlecount
Name AliasProperty Name = ProcessName
NPM AliasProperty NPM = NonpagedSystemMemorySize64
PM AliasProperty PM = PagedMemorySize64
SI AliasProperty SI = SessionId
VM AliasProperty VM = VirtualMemorySize64
WS AliasProperty WS = WorkingSet64
...
Die Ausgabe zeigt den Typ des Objekts, das der Befehl Get-Process
zurückgibt (System.Diagnostics.Process
). Der verbleibende Teil der Antwort zeigt den Namen, den Typ und die Definition der Objektmember an. Wie Sie sehen, ist die Kopplung mit Get-Process
ein sinnvoller erster Schritt, wenn Sie Get-Member
mit einem anderen Befehl in einer Pipeline kombinieren möchten.
Select-Object
Wenn Sie einen Befehl ausführen, dessen Ausgabe auf den Bildschirm erfolgt, fügt PowerShell standardmäßig automatisch den Befehl Out-Default
hinzu. Wenn es sich bei den Ausgabedaten um eine Sammlung von Objekten handelt, ermittelt PowerShell anhand des Objekttyps, ob es eine registrierte Ansicht für diesen Objekttyp gibt. Wenn dies der Fall ist, wird diese Ansicht verwendet.
Die Ansicht enthält in der Regel nicht alle Eigenschaften eines Objekts, da sie nicht ordnungsgemäß auf dem Bildschirm angezeigt würden. Daher werden nur einige der gängigsten Eigenschaften in die Ansicht aufgenommen.
Sie können die Standardansicht überschreiben, indem Sie Select-Object
verwenden und Ihre eigene Liste von Eigenschaften auswählen. Sie können diese Eigenschaften dann an Format-Table
oder Format-List
senden, um die Tabelle in beliebiger Form anzuzeigen.
Betrachten Sie das Ergebnis der Ausführung von Get-Process
mit dem Prozess zsh
:
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
0 0.00 0.01 0.38 644 620 zsh
0 0.00 0.01 0.38 727 727 zsh
0 0.00 0.01 0.38 731 731 zsh
0 0.00 0.01 0.38 743 743 zsh
0 0.00 0.01 0.38 750 750 zsh
0 0.00 0.88 0.91 15747 …47 zsh
0 0.00 0.01 0.29 41983 …83 zsh
0 0.00 1.16 0.31 68298 …98 zsh
Das Ergebnis ist eine Ansicht, die der wahrscheinlich gewünschten Anzeige entspricht, die Sie von diesem Befehl erwarten. Diese Ansicht enthält jedoch keine vollständigen Informationen. Wenn Sie andere Informationen anzeigen möchten, können Sie explizit angeben, welche Eigenschaften im Ergebnis enthalten sein sollen.
Abrufen der vollständigen Antwort
Was Sie bisher gesehen haben, ist eine eingeschränkte Antwort. Um die vollständige Antwort darzustellen, verwenden Sie wie folgt einen *
-Platzhalter:
Get-Process zsh | Format-List -Property *
Das Zeichen *
stellt jedes Attribut und den zugehörigen Wert dar. So können Sie die Werte untersuchen, die für Sie von Interesse sind. Die vollständige Antwort verwendet außerdem anstelle der tatsächlichen Eigenschaftennamen Präsentationsnamen für Eigenschaften, und diese wirken in einem Bericht gut.
Trotz dieser Vorteile möchten Sie vielleicht nicht die vollständigen Daten ausgeben, sind möglicherweise aber auch nicht mit der Standardantwort zufrieden.
Auswählen bestimmter Spalten
Um die Antwort einzuschränken und einen Mittelweg zwischen der Standardantwort und der vollständigen Antwort zu finden, sollten Sie einige Eigenschaften auswählen, an denen Sie interessiert sind, und diese als Parametereingabe für Select-Object
verwenden. Aber – und hier liegt ein Problem vor – Sie müssen die tatsächlichen Namen für die Spalten verwenden. Wie finden Sie die tatsächlichen Namen heraus? Verwenden Sie Get-Member
. Ein Aufruf von Get-Member
liefert Ihnen alle Eigenschaften mit ihren tatsächlichen Namen.
Suchen der tatsächlichen Eigenschaftsnamen
Lassen Sie uns schnell die Standardantwort anhand dieser Teilmenge zusammenfassen:
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
0 0.00 0.01 0.38 644 620 zsh
In der Standardantwort werden die Eigenschaften Id
und ProcessName
höchstwahrscheinlich identisch bezeichnet, aber „CPU(s)“ ist ein Präsentationsname. Tatsächliche Eigenschaftsnamen bestehen in der Regel nur aus Textzeichen, ohne Leerzeichen. Um den tatsächlichen Namen für eine bestimmte Eigenschaft zu ermitteln, können Sie Get-Member
verwenden:
Get-Process zsh | Get-Member -Name C*
Sie erhalten auf diese Weise eine Liste aller Member, deren Namen mit C
beginnt. Darunter befindet sich CPU
, was wahrscheinlich das gewünschte Ergebnis ist:
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
CancelErrorRead Method void CancelErrorRead()
CancelOutputRead Method void CancelOutputRead()
Close Method void Close()
CloseMainWindow Method bool CloseMainWindow()
Container Property System.ComponentModel.IContainer Container {get;}
CommandLine ScriptProperty System.Object CommandLine {get=…
Company ScriptProperty System.Object Company {get=$this.Mainmodule.FileVersionInfo.CompanyName;}
CPU ScriptProperty System.Object CPU {get=$this.TotalProcessorTime.TotalSeconds;}
Sie wissen jetzt, wie Sie mit Select-Object
genau die benötigten Informationen mit den richtigen Eigenschaftsnamen abfragen können, etwa wie folgt:
Get-Process zsh | Select-Object -Property Id, Name, CPU
Und so sieht die Ausgabe aus:
Id Name CPU
-- ---- ---
644 zsh 0.3812141
727 zsh 0.3826498
731 zsh 0.3784953
743 zsh 0.3776352
750 zsh 0.3824036
15747 zsh 0.9097993
41983 zsh 0.2934763
68298 zsh 0.3121695
Mit dieser Befehlsfolge erhalten Sie eine Ausgabe, die sich von der Standardausgabe unterscheidet, aber für Sie relevante Eigenschaften enthält.
Sortierung
Wenn Sie in einer Pipeline Sort-Object
verwenden, sortiert PowerShell die Ausgabedaten zunächst anhand der Standardeigenschaften. Wenn keine solchen Eigenschaften vorhanden sind, wird versucht, die Objekte selbst zu vergleichen. Die Sortierung erfolgt entweder in aufsteigender oder in absteigender Reihenfolge.
Durch das Angeben von Eigenschaften können Sie wie folgt nach bestimmten Spalten sortieren:
Get-Process | Sort-Object -Descending -Property Name
Im vorangegangenen Befehl sortieren wir nach der Spalte Name
in absteigender Reihenfolge. Um nach mehr als einer Spalte zu sortieren, trennen Sie die Spaltennamen wie hier gezeigt durch ein Komma:
Get-Process | Sort-Object -Descending -Property Name, CPU
Zusätzlich zum Sortieren nach Spaltennamen können Sie auch einen eigenen benutzerdefinierten Ausdruck angeben. In diesem Beispiel wird ein benutzerdefinierter Ausdruck verwendet, um nach den Spalten Name
und CPU
zu sortieren und die Sortierreihenfolge für jede Spalte zu steuern.
Get-Process 'some process' | Sort-Object -Property @{Expression = "Name"; Descending = $True}, @{Expression = "CPU"; Descending = $False}
Das vorangegangene Beispiel zeigt, wie leistungsstark und flexibel Sort-Object
sein kann. Dieses Thema ist etwas komplexer und sprengt den Rahmen dieses Moduls, wird aber in fortgeschritteneren Modulen wieder aufgegriffen.