Dawno nie było o PowerShell, dlatego dzisiaj trochę o typach wyliczeniowych (Enumerations, Enum). Co to jest, do czego służy, jak są zalety ich stosowania.

Co to jest Enum w PowerShell?

Typ wyliczeniowy jest w rzeczywistości prostą konstrukcją. Tylko definiuje zbiór stałych, jakie może przyjmować zmienna tego typu. Jest to sposób określania wcześniej zdefiniowanego zestawu elementów, które są skojarzone ze wspólnym typem. Jeśli do walidacji parametrów w funkcjach używałeś kiedyś ValidateSet, to Enum dostarcza bardzo podobną funkcjonalność.

Do czego służy Enum?

Dobrą praktyką przy pisaniu skryptów jest unikanie powtórzeń. Wtedy zapobiegamy sytuacji, gdy już w dużym skrypcie musimy zmienić jedną rzecz w kilku miejscach. Te założenia pomagają realizować funkcje, klasy i między innymi typy wyliczeniowe. Również ten typ może posłużyć do tego, aby się nie rozpisywać. Wyjaśnienie być może lakoniczne, ale przykłady rozwieją wszelkie wątpliwości.

Definiujemy pierwsze Enum

Aby utworzyć typ wyliczeniowy w PowerShell, używamy słowa kluczowego enum. Następnie w klamrach definiujemy jego elementy.

Enum ma kika ograniczeń. Elementy nie mogą mieć spacji. Wszelkie próby stosowania cudzysłowu (polski język trudny jest:) nie będzie działać. Nazwa Enum nie może zawierać znaków specjalnych, wyjątkiem jest podkreślenie.

W przykładzie zdefiniowany został typ o nazwie [Day] z wszystkimi dniami tygodnia. Aby można było odwołać się do elementów należy po nazwie typu w klamrach użyć dwóch dwukropków jak poniżej.

Enum w PowerShell - wywołanie

Definiując enum możemy nadawać wartości, aby w szybki sposób odwoływać się poprzez nie do konkretnych elementów.

Gdzie i jak wykorzytać Enum w PowerShell?

Wyżej wspomniałem o atrybucie walidacji ValidateSet dla parametrów w funkcjach jak porównanie do Enum. W przykładzie użycie ValidateSet wygląda to mniej więcej tak.

Wywołując funkcję, wartość parametru musi być wpisany dokładnie tak jeden z elementów umieszczony na liście.

Enum w PowerShell - stosowanie w funkcji

Za pomocą Enum zrealizujemy to samo, jednak szybciej i lepiej. Wystarczy parametr $Name w funkcji zadeklarować, nie jako typ [String] ale jako[Day] który utworzyliśmy wcześniej. Czyli jest szybciej.

Lepiej pod tym względem, że PowerShell potrafi dopasować element nawet jeśli nie został wpisany precyzyjnie. Pod warunkiem, że parser jest wstanie jednoznacznie wskazać jeden z elementów. Identyczny mechanizm (sposób skracania składni) jest znany dla podawania parametrów dla funkcji.

Enum w PowerShell -- zalety w stosunku ValidateSet

Dzięki jawnemu zadeklarowaniu typu zmiennej, możemy się odwoływać do elementów Enum po przypisanych do nich wartościach.

Enum w PowerShell - sposób użycia

Prostę prawda? Rozwiązanie daje zarazem świetny sposób organizowania podobnych elementów oraz tworzenie atrybutów walidacji.

Istniejące typy wyliczeniowe

W samym PowerShell mamy domyślne, istniejące takie typy. Wyżej utworzyłem enum [Day] który pokrywa się z istniejącym typem [DayOfWeek]

Aby sprawdzić jakie elementy i wartości są dostępne dla tego typu możemy skorzystać z klasy System.Enum.

Enum w PowerShell - sprawdzenie elementów w istniejących typach wyliczeniowych

Przykład funkcji z wykorzystaniem istniejącego typu [System.DayOfWeek].

Podsumowanie

Świetna i zarazem prosta konstrukcja, niezwykle użyteczna, umożliwiająca ograniczenie zbędnych zmian w wielu miejscach.

Mateusz Nadobnik

Z pasją poświęcam czas na zdobywanie wiedzy w zakresie szeroko rozumianej Data Platform. Zachwycony językiem skryptowym Windows PowerShell. Swoją wiedzę, doświadczenia i spostrzeżenia opisuję na blogu.

read more

2 komentarze

  • Reply

    Artur Dębkowski | ekhart.pl

    Październik 11, 2017 at 11:48 am

    Takie pytanko, czy PowerShell jest też dostępny poza Windowsem? Brakuje mi trochę jakiegoś języka shellowego platform-independent, którego warto by się nauczyć. PowerShell byłby ciekawą opcją.

  • Reply

    Mateusz Nadobnik

    Październik 11, 2017 at 12:26 pm

    Cześć Artur. Dzięki za komentarz. Co do Twojego pytania, to PowerShell 6.0 Core jest tym czego szukasz. Spójrz na to –
    https://github.com/PowerShell/PowerShell