Bereit, deine PowerShell-Enum-Kenntnisse zu erweitern? Entdecke, wie [Flags()] einfache Enums in leistungsstarke Binärkombinationen umwandelt, sodass du mehrere Einstellungen mit eleganter Präzision verwalten kannst – perfekt für Funktionsflags, Berechtigungssysteme und Konfigurationsverwaltung.

Tobias & Aleksandars Tipp:

Mehr zur Verwendung von Enums 

Einfache Enums definieren eine Liste zulässiger Werte, von denen der Benutzer genau einen auswählen kann. Wenn Enums als Flag-Array definiert sind, kann der Benutzer mehr als einen Wert auswählen:

[Flags()]

enum Features

{

   BootLog

   RealTimeProtection

   Firewall

   PhysicalAccess

   Leash

}



[Features]$myFeatures = 'Firewall', 'Leash'

$myFeatures 

Durch das Hinzufügen des Attributs [Flags()] zur Enum erhält jeder Enum-Eintrag nun seinen eigenen eindeutigen Bit-Wert, so dass der Benutzer beliebig viele Enum-Elemente kombinieren kann. Der Typ [Enum] kann hier etwas Licht ins Dunkel bringen. Hier listet er die definierten Enum-Namen auf:

  • PS C:\> [Enum]::GetNames([Features])


Als Nächstes werden die zugewiesenen echten numerischen Werte angezeigt:

  • PS C:\> [Enum]::GetNames([Features]) | ForEach-Object {
       '{0} = {1}' -f $_, ([Features]::$_ -as [int])
    }


Wenn du  mehrere Werte zuweist, werden Bit-Werte hinzugefügt:

  • PS C:\> [Features]$myFeatures = 'Firewall', 'Leash'
    PS C:\> $myFeatures
    Firewall, Leash 
    PS C:\> $myFeatures.value__


Es gibt nur ein Problem: Die zugewiesenen Nummern sind fortlaufend und damit mehrdeutig - PhysicalAccess hat die ID 3, aber RealTimeProtection+Firewall zählt auch zu 3.

Wenn du [Flags()] verwendest, müssen den Enum-Elementen auch manuell eindeutige Werte zugewiesen werden:

[Flags()]

enum Features

{

   BootLog =  1

   RealTimeProtection = 2

   Firewall = 4

   PhysicalAccess = 8

   Leash = 16

}


Jetzt hat jedes Element eine eindeutige ID:

  • PS C:\> [Enum]::GetNames([Features]) | ForEach-Object {'{0} = {1}' -f $_,
    ([Features]::$_ -as [int])}


Nun, mit eindeutigen IDs, kannst du Enums wie jede andere Zahl verwenden, um binäre Arithmetik zu betreiben:

  • PS C:\> [Features]'Bootlog,Leash'
    BootLog, Leash
    PS C:\> [Features]'Bootlog,Leash' -as [int]


Verwende den Operator "+=", um ein Element hinzuzufügen, und "-=", um es zu entfernen:

 

  • PS C:\> [Features]$features = 'Bootlog'
    PS C:\> $features += 'Leash'
    PS C:\> $features += 'Firewall'
    PS C:\> $features
    BootLog, Firewall, Leash
    PS C:\> $features -= 'Leash'
    PS C:\> $features
    BootLog, Firewall

Auch um zu prüfen, ob ein bestimmter Wert in einer solchen Liste vorhanden ist, können binäre Operatoren wie -band und -bor verwendet werden:

  • PS C:\> $features
    BootLog, Firewall
    PS C:\> ($features -band 'Firewall') -eq 'Firewall'
    True
    PS C:\> ($features -band 'Leash') -eq 'Leash'
    False

Verwandte Links