Tags: PowerShell
PowerShell 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.
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 *
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
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.
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
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.