Auswählen von Daten

Abgeschlossen

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.