Select-Object: Eigenschaften von Objekten in PowerShell filtern


    Tags:

    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.

    Größe von Dateien aus dem Output von Get-ChildItem extrahieren

    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 ein- und ausschließen

    Die meisten Cmdlets zeigen standardmäßig nur einen Teil der Eigenschaften von Objekten an. So beschränkt Get-Process seine Ausgabe auf NPM(K), PM(M), WS(M), CPU(s), Id, SI und ProcessName.

    Möchte man zusätzliche Eigenschaften sehen, dann ruft man Select mit dem Parameter Property auf. Übergibt man ihm '*' als Wert, dann erhält man sämtliche Eigenschaften:

    Get-Process -Name *explorer* | select -Property *

    Alle Eigenschaften eines Prozesses mit Hilfe von Select -Property * ausgeben

    Alternativ kann man Property eine Liste von Komma-separierten Werten übergeben, um nur ausgewählte Eigenschaften anzuzeigen:

    Get-Process -Name *explorer* |
    select -Property CommandLine, StartTime, Handles

    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. Auch ExcludeProperty erlaubt die Verwendung von Wildcards.

    Arrays und Objekte auflösen

    Die Eigenschaften eines Objekts müssen nicht simple Datentypen sein, sondern können auch Arrays oder Objekte umfassen. Die Ausgabe zeigt Arrays standardmäßig als eine durch Komma getrennte Liste an.

    Um den Inhalt eines Arrays aufzulösen, ruft man Select-Object mit dem Parameter ExpandPropterty auf. Ein Beispiel dafür sind die Module eines Prozesses, die von Get-Process ausgegeben werden. Hier würde der Aufruf so aussehen:

    Get-Process -Name *explorer* | select -ExpandProperty Modules

    Anzeige eines Arrays in der Standardausgabe und anschließend in der aufgelösten Form mit ExpandProperty

    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.

    Täglich Know-how für IT-Pros mit unserem Newsletter

    Wir ver­wenden Ihre Mail-Adresse nur für den Ver­sand der News­letter.
    Es erfolgt keine per­sonen­be­zogene Auswertung.

    Bild von Wolfgang Sommergut
    Wolfgang Sommergut hat lang­jährige Erfahrung als Fach­autor, Berater und Kon­ferenz­sprecher zu ver­schie­denen Themen der IT. Da­ne­ben war er als System­ad­mi­ni­stra­tor und Con­sultant tätig.
    // Kontakt: E-Mail, XING, LinkedIn //

    Verwandte Beiträge

    Weitere Links

    1 Kommentar

    Gute Beispiele, wie können nicht belegte Attribute unterdrückt werden?
    Also nur Attribute ausgeben mit einem Wert.