Windows_PowerShell_iconczęsto zamiast budowy skomplikowanych IFów lepiej jest skorzystać ze switcha. czyli zamienić złożoną składnię bazowaną na wielu ‘if-then-else’ dużo czytelniejszym i prostszym blokiem ‘switch’. to oczywista oczywistość ale jest coś bardziej ‘zaawansowanego’ co jeszcze bardziej ułatwia życie – PowerShellowy Switch pozwala nie tylko na proste porównania, czy definicje wildcardów, które można znaleźć w manualu, ale również na tworzenie złożonych wyrażeń logicznych.

przykład takiego switcha:

test-switch.ps1

param(
    [int]$int
)

switch($int) {
    1 { write-host 'normalka'}
    {2 -or 3} {write-host 'ten sam dla dwóch wartości'}
    {$_ -ge 4} { write-host 'wieksze niz 3'}
    {$_ -ge 5} { write-host 'wieksze niz 4'
        break;
    }
    {$_ -lt 8} {write-host 'mniejsze niz 8 [ale nie wieksze niz 4]'} 
    default { write-host 'wszystkie inne'}
}

uwagę należy zwrócić na:

  • zastosowanie ‘break’ – standardowo switch wykona *wszystkie* bloki, spełniające warunek. w przypadku wywołania test-switch z parametrem 1 lub 2 pojawi się dodatkowo informacja ‘mniejsze niż 4 [ale nie większe niż 2]‘ . jeśli liczba będzie większa niż 3, wpadnie w klauzulę z ‘break’ i ostatni krok nie zostanie wykonany. dla tego należy pamiętać, że *kolejność ma znaczenie*.
  • dzięki temu, że switch wykonuje wszystkie bloki spełniające warunek, można zrobić krok typu ‘catch all’ – który wykona się zawsze. ale warto umieścić go jako pierwszy tak, żeby nie przerwał go jakiś break. najlepiej użyć ‘switch -wildcard’ -> manual.
  • w instrukcji [man switch] można znaleźć bardzo fajne przykłady dla wyrażeń regularnych i wildcardów, dla tego pomijam go w tym prostym przykładzie. ale warto wiedzieć, że można wykonywać również zaawansowane porównania na ciągach znaków.
  • to czego zabrakło w manualu to właśnie przykład wyrażenia logicznego. klauzulą może być dowolne wyrażenie zamknięte w nawiasach klamrowych {} . oczywiście dla determinizmu zachowania powinno zwracać true/false.
  • PS switch nie pozwala na definiowane tego samego bloku dla kilq wartości [listy] tak, jak to się robi np. w VBS, czyli nie da się zdefiniować ‘ 1,2 { blok } ‘ . w zamian można użyć warunku logicznego ‘{1 -or 2} {blok} ‘ . trochę mniej wygodne, ale działa tak samo (:

proste i wydajne. proponuję dla gimnastyki rozpisać to sobie na IFach… (;

eN.

 

Spread the love

Zostaw komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Time limit is exhausted. Please reload CAPTCHA.