Kürzlich habe ich mein BCDEdit-Modul wieder angefasst, um einige Funktionen zu überarbeiten. Das Modul erstellt dabei dynamisch Objekte aus dem BCD-Store, indem es per regulärem Ausdruck die Ausgaben von bcdedit.exe einliest, auftrennt und als Objekt zurückgibt.
Dummerweise sind aber nicht alle BCD-Einträge gleich. Einige Eigenschaften werden von BCDedit nur angezeigt, wenn Sie auch tatsächlich gesetzt sind. Um in einer If-Abfrage keine Fehlermeldung zu bekommen, wenn die Eigenschaft gar nicht existiert - die Fehlermeldung kann auch nicht unterdrückt werden, da es sich um einen terminierenden Fehler handlet - muss vorher geprüft werden, ob die Eigenschaft vorhanden ist. Das geht tatsächlich sehr einfach, ist aber gut versteckt. Denn an jedem Objekt hängt ein verstecktes Memberset namens psobject, das nur angezeigt wird, wenn man get-Member mit dem Parameter -force aufruft.
get-childitem C:\Windows | get-member -force
PSObject beinhaltet Metainformationen über das Object, unter anderem eine Auflistung aller Eigenschaften.
$Folder = Get-Childitem C:\Windows | Get-Member -force
$Folder.psobject.Properties
Die Eigenschaft Name jeder Property entspricht dem Eigenschafsnamen. Um zu prüfen, ob eine Eigenschaft in der Liste enthalten ist, können Sie jetzt einfach den -contains-Operator verwenden:
If ( $folder.PSObject.Properties.Name -contains "Attributes" )
{
"Die Eigenschaft Attributes existiert"
}