Select-Object: Eigenschaften von Objekten in PowerShell filtern


    Tags:

    Kostenloser Guide für den KVM-Hypervisor: Unterschiede zu Hyper-V und ESXi, Übersicht über Management-Tools, Tipps zu virt-manager. Download »

    (Anzeige)

    Powershell-LogoPowerShell kann mit Hilfe seiner zahlreichen Cmdlets fast alle Systeminformationen auslesen. Häufig erhält man dabei mehr Daten, als man benötigt und vernünftig darstellen kann. Aus diesem Grund bietet PowerShell die Möglichkeit, ausgewählte Attribute von Objekten mit Hilfe von Select-Object zu extrahieren.

    Gibt eine Abfrage beispielsweise ein Dateiobjekt als Ergebnis zurück, dann besitzt dieses eine Vielzahl an Eigenschaften, unter anderem den Namen, die Extension, verschiedene Zeitangaben für Zugriffe, Attribute oder die Größe. Abhängig von der Aufgabe, die man erledigen möchte, wird man nur eine oder wenige davon benötigen. Das könnte beispielsweise die Länge sein, um große Dateien zu finden.

    Attribute anzeigen mit Get-Member

    Wenn man die Namen der Eigenschaften eines Objekts nicht kennt, dann kann man diese leicht herausfinden, indem man es über eine Pipe an das Cmdlet Get-Member schickt. Danach benutzt man Select-Object, um die Werte der gewählten Attribute auszulesen.

    Für dieses Cmdlet existiert das vordefinierte Alias Select, das bei einer interaktiven Nutzung der PowerShell Tipparbeit erspart. In Scripts zählt es zu den Best Practices, keine Aliase zu verwenden, weil man nicht sicher sein kann, dass sie auf jedem Zielsystem existieren.

    Um beim obigen Beispiel zu bleiben, würde man die Dateigröße so ermitteln:

    Get-ChildItem -File .\config.ini | Select -Property Length

    In diesem Fall würde nur die Größenangabe für config.ini angezeigt. Beim benannten Parameter -Property kann man auf die Angabe der Bezeichnung verzichten und bloß die Namen der Eigenschaften einfügen, wenn diese direkt auf Select folgen.

    Mehrere Eigenschaften auswählen

    Besteht das Ergebnis von Get-ChildItem aus mehreren Dateien oder Verzeichnissen, dann ist eine Zahlenkolonne ohne weitere Angaben wenig hilfreich. Um zusätzlich etwa den Dateinamen anzuzeigen, erlaubt Select-Object die Spezifizierung mehrerer Eigenschaften, die man durch ein Komma voneinander trennen muss:

    Get-ChildItem -File .\config.ini | Select FullName, Length

    Bei der Darstellung der ausgegebenen Eigenschaften verhält sich Select-Object dynamisch: Gibt man bis zu vier Eigenschaften an, dann verwendet es die Tabellenform, ansonsten die Listenform. Normalerweise legt man diese explizit fest, indem man den Output über eine Pipe an Format-Table bzw. Format-List schickt.

    Will man mehrere Eigenschaften eines Objekts ausgeben, dann übergibt man ihre Namen als Komma-separierte Liste an Select-Object.

    Attribute ausschließen

    Wenn man fast alle Attribute eines Objekts anzeigen und bloß auf wenige verzichten möchte, dann kann man diese mit dem Parameter -ExcludeProperty ausschließen:

    Get-ChildItem -File .\config.ini | Select -Property * -ExcludeProperty Length, Attributes

    Wie dieses Beispiel zeigt, verlangt -ExcludeProperty die Verwendung des Parameters -Property, dem man den Wert '*' übergibt, wenn man alle Eigenschaften erhalten will. Auch -ExcludeProperty erlaubt die Verwendung von Wildcards.

    Ergebnis einschränken mit -first und -last

    Weitere Schalter, um die Ergebnismenge einzuschränken, sind -First, -Last, -Index und -Skip. Die Parameter -First und -Last erwarten einen numerischen Wert, der die Anzahl der ersten und letzten Einträge aus dem Ergebnis spezifiziert:

    Get-VM | Select name, state -first 3

    Dieser Befehl würde den Namen und den Status der ersten 3 VM anzeigen, die von Get-VM zurückgegeben werden. Da es sich dabei um ein Array handelt, kann man auch einzelne Objekte über ihren Index ein- oder ausschließen. Zuständig sind dafür die Schalter -Index und -Skip:

    Get-VM | Select -Index 2

    Dabei sind zwei Eigenheiten zu beachten: -Index und -Skip lassen sich nicht mit -Property kombinieren, so dass ein solcher Aufruf von Select-Object immer die Objekte mit allen Eigenschaften zurückgibt. Außerdem muss man berücksichtigen, dass -Skip bei seiner Zählung von Array-Elementen bei 1 beginnt, obwohl PowerShell damit sonst bei 0 startet.

    Redundante Werte konsolidieren mit -Unique

    Kann eine Eigenschaft eine Vielzahl von Werten annehmen, dann interessiert möglicherweise nur, welche davon vorhanden sind.

    Der Parameter -unique bewirkt, dass jeder Wert eines Attributs nur einmal im Ergebnis auftaucht.

    Zu diesem Zweck lassen sich alle redundanten Werte mit Hilfe von -Unique ausblenden:

    Get-VM | Select state -Unique

    Dieser Aufruf würde darüber informieren, welche Stati die mit Get-VM ermittelten virtuellen Maschinen haben und ob beispielsweise welche dabei sind, die gespeichert oder ausgeschaltet wurden.

    Keine Kommentare