PowerShell für Anfänger – die praktische psobject-Property

Es ist eine der größeren Herausforderungen für viele PowerShell-Anfänger den Unterschiedzwischen Select-Object und Where-Object zu verstehen. Das liegt weniger an der Namensgebung, sondern in erster Linie daran, dass am Anfang überhaupt nicht klar ist, was es konkret bedeutet, dass Ausgaben immer aus „Objekten“ bestehen.

Die nächste Hürde besteht darin, den Unterschied zwischen dem Namen einer Eigenschaft und ihrem Wert zu verstehen.

Ein

Get-Process -ID $PID  | Select-Object -Property *Time*

gibt vom aktuellen PowerShell-Prozess alle Eigenschaften mit ihren Werten zurück, in deren Name das Wort „Time“ enthalten ist.

Wie aber müsste die Abfrage lauten, wenn alle Eigenschaften ausgegeben werden sollen, die z.B. keinen Wert besitzen?

Anders, als man es vielleicht vermuten würde, ist eine solche Abfrage mit Where-Object zunächst nicht möglich. In der vereinfachten Syntax muss der linke Vergleichswert immer der Name einer Property sein.

Ein

Get-Process -ID $PID | Where-Object * -ne $null

funktioniert nicht, da für den Property-Parameter kein Platzhalter eingesetzt werden darf (das musste ich allerdings erst noch einmal selber überprüfen;).

Möchte man für eine Abfrage auf die „Beschaffenheit“ (Medaten) eines Objekts zugreifen, also z.B. auf die Namen, Typen und Werte der Properties, kommt die „unsichtbare“ psobject-Property ins Spiel, über die jedes (!) Objekt verfügt. Siegibt das „PowerShell-Objekt“ zurück. Das ist jenes Objekt, von dem sich jedes von der Powershell angelegte Objekt ableitet.

Das PowerShell-Objekt besitzt folgende Properties:

>BaseObject

>IntermediateBaseObject

>Members

>Method

>Properties

>TypeNames

Der folgende Befehl gibt alle Properties des Process-Objekts zurück.

(Get-Process -ID $PID).psobject.properties

Diesselben Informationen liefert zwar auch Get-Member, in diesem Fall lassen sie sich aber flexibler weiterverarbeiten.

Die folgende Abfrage gibt die Namen und (damit die Ausgabe nicht so „nackt“ ist) auch die Typen aller Eigenschaften des PowerShell-Prozess-Objekts zurück, die keinen Wert besitzen.

(Get-Process -ID $PID).psobject.properties.where{$_.Value -eq $null} | Se<br>lect-Object Name,TypeNameOfValue
Abb. Dank der psobject-Property ist auch ein Filtern nach den Namen und Werten von Eigenschaften möglich.

Praktisch ist diese Technik bei Abfragen mit Get-WmiObject, da sichd die zahlreichen Eigenschaften, die mit __ beginnen, ausblenden lassen.

(Get-WmiObject -Class Win32_Process -Filter "ProcessId=$PID").psobject.Pr<br>operties.Where{$_.Name -notlike "<em>_*" -and $</em>.Value -ne $null} | Select Name,Value | Sort Name

Auch wenn der Tippaufwand für diese Abfrage insgesamt doch recht groß ist, werden endlich nur jene Properties ausgeben, die keine Spezial-WMI-Properties sind, und die einen Wert besitzen.

Fazit: Bei der PowerShell besitzt jedes Objekt eine psobject-Eigenschaft. Sie liefert sozusagen das „Rahmenobjekt“, in das jedes Objekt eingebaut wird. Mit seiner properties-Eigenschaft lassen sich neben den Namen auch die Werte von Eigenschaften abfragen was in manchen Situationen ganz praktisch sein kann. Auch wenn man diese Eigenschaft nie verwenden wird, sollte man wissen, dass es sie gibt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.