Udostępnij za pośrednictwem


about_Switch

Krótki opis

W tym artykule wyjaśniono, jak używać przełącznika do obsługi wielu if instrukcji.

Długi opis

Aby sprawdzić warunek w skrycie lub funkcji, użyj instrukcji if . Instrukcja if może sprawdzać wiele typów warunków, w tym wartość zmiennych i właściwości obiektów.

Aby sprawdzić wiele warunków, użyj instrukcji switch . Instrukcja jest równoważna switch serii instrukcji if , ale jest prostsza. Instrukcja switch zawiera listę każdego warunku i akcję opcjonalną. Jeśli warunek zostanie spełniony, wykonywana jest akcja.

Instrukcja switch może używać zmiennych automatycznych $_ i $switch . Aby uzyskać więcej informacji, zobacz about_Automatic_Variables.

Składnia

Podstawowa switch instrukcja ma następujący format:

Switch (<test-expression>)
{
    <result1-to-be-matched> {<action>}
    <result2-to-be-matched> {<action>}
}

Równoważne if instrukcje to:

if (<result1-to-be-matched> -eq (<test-expression>)) {<action>}
if (<result2-to-be-matched> -eq (<test-expression>)) {<action>}

Jest <test-expression> to pojedyncze wyrażenie, które jest obliczane w trybie wyrażenia w celu zwrócenia wartości.

Jest <result-to-be-matched> to wyrażenie, którego wartość jest porównywana z wartością wejściową. Wyrażenia obejmują wartości literałów (ciągi lub liczby), zmienne i bloki skryptów, które zwracają wartość logiczną.

Każda wartość bez cudzysłów, która nie jest rozpoznawana jako liczba, jest traktowana jako ciąg. Aby uniknąć nieporozumień lub niezamierzonej konwersji ciągów, zawsze należy cytować wartości ciągów. Należy ująć dowolne wyrażenia w nawiasy (), tworząc podwyrażenia, aby upewnić się, że wyrażenie jest poprawnie oceniane.

Ważne jest, aby zrozumieć, że <result-to-be-matched> wartość znajduje się po lewej stronie wyrażenia porównania. Oznacza to, że wynik obiektu <test-expression> znajduje się po prawej stronie, który można przekonwertować na typ wartości po lewej stronie do porównania. Aby uzyskać więcej informacji, zobacz about_Comparison_Operators

Wartość default jest zarezerwowana dla akcji używanej, gdy nie ma innych dopasowań.

Zmienna automatyczna $_ zawiera wartość wyrażenia przekazanego do switch instrukcji i jest dostępna do oceny i użycia w zakresie instrukcji <result-to-be-matched> .

switch Pełna składnia instrukcji jest następująca:

switch [-regex | -wildcard | -exact] [-casesensitive] (<test-expression>)
{
    "string" | number | variable | { <value-scriptblock> } { <action-scriptblock> }
    default { <action-scriptblock> } # optional
}

lub

switch [-regex | -wildcard | -exact] [-casesensitive] -file filename
{
    "string" | number | variable | { <value-scriptblock> } { <action-scriptblock> }
    default { <action-scriptblock> }  # optional
}

Jeśli nie są używane żadne parametry, switch zachowuje się tak samo jak przy użyciu parametru Exact . Wykonuje dopasowanie bez uwzględniania wielkości liter dla wartości. Jeśli wartość jest kolekcją, każdy element jest obliczany w kolejności, w jakiej się pojawia.

Instrukcja switch musi zawierać co najmniej jedną instrukcję warunku.

Klauzula default jest wyzwalana, gdy wartość nie pasuje do żadnego z warunków. Jest ona równoważna klauzuli else w instrukcji if . W każdej switch instrukcji jest dozwolona tylko jedna default klauzula.

switch ma następujące parametry:

  • Symbol wieloznaczny — wskazuje, że warunek jest ciągiem wieloznacznymi. Jeśli klauzula match nie jest ciągiem, parametr jest ignorowany. Porównanie nie uwzględnia wielkości liter.
  • Exact — wskazuje, że klauzula match, jeśli jest ciągiem, musi być dokładnie zgodna. Jeśli klauzula match nie jest ciągiem, ten parametr jest ignorowany. Porównanie nie uwzględnia wielkości liter.
  • CaseSensitive — wykonuje dopasowanie uwzględniające wielkość liter. Jeśli klauzula match nie jest ciągiem, ten parametr jest ignorowany.
  • Plik — pobiera dane wejściowe z pliku, a nie z <test-expression>. Jeśli dołączono wiele parametrów pliku , zostanie użyty tylko ostatni parametr. Każdy wiersz pliku jest odczytywany i oceniany przez instrukcję switch . Porównanie nie uwzględnia wielkości liter.
  • Wyrażenie regularne — wykonuje wyrażenie regularne zgodne z wartością warunku. Jeśli klauzula match nie jest ciągiem, ten parametr jest ignorowany. Porównanie nie uwzględnia wielkości liter. Zmienna automatyczna $matches jest dostępna do użycia w pasującym bloku instrukcji.

Uwaga

Podczas określania wartości powodujących konflikt, takich jak regex i symbol wieloznaczny, ostatni określony parametr ma pierwszeństwo, a wszystkie parametry powodujące konflikt są ignorowane. Dozwolone jest również wiele wystąpień parametrów. Jednak jest używany tylko ostatni parametr na liście.

Przykłady

W poniższym przykładzie switch instrukcja porównuje wartość testu 3 z każdą z warunków. Gdy wartość testu jest zgodna z warunkiem, wykonywana jest akcja.

switch (3)
{
    1 {"It is one."}
    2 {"It is two."}
    3 {"It is three."}
    4 {"It is four."}
}
It is three.

W tym prostym przykładzie wartość jest porównywana z każdym warunkiem na liście, mimo że istnieje dopasowanie dla wartości 3. Poniższa switch instrukcja ma dwa warunki dla wartości 3. Pokazuje, że domyślnie wszystkie warunki są testowane.

switch (3)
{
    1 {"It is one."}
    2 {"It is two."}
    3 {"It is three."}
    4 {"It is four."}
    3 {"Three again."}
}
It is three.
Three again.

Aby skierować metodę switch , aby zatrzymać porównywanie po dopasowaniu, użyj instrukcji break . Instrukcja break kończy instrukcję switch .

switch (3)
{
    1 {"It is one."}
    2 {"It is two."}
    3 {"It is three."; Break}
    4 {"It is four."}
    3 {"Three again."}
}
It is three.

Jeśli wartość testowa jest kolekcją, taką jak tablica, każdy element w kolekcji jest obliczany w kolejności, w jakiej się pojawia. Poniższe przykłady oceniają wartość 4, a następnie 2.

switch (4, 2)
{
    1 {"It is one." }
    2 {"It is two." }
    3 {"It is three." }
    4 {"It is four." }
    3 {"Three again."}
}
It is four.
It is two.

Wszystkie break instrukcje dotyczą kolekcji, a nie do każdej wartości, jak pokazano w poniższym przykładzie. Instrukcja switch jest przerywana przez instrukcję break w warunku wartości 4.

switch (4, 2)
{
    1 {"It is one."; Break}
    2 {"It is two." ; Break }
    3 {"It is three." ; Break }
    4 {"It is four." ; Break }
    3 {"Three again."}
}
It is four.

W tym przykładzie instrukcja switch testuje typ wartości w tabeli skrótów. Należy użyć wyrażenia i zwracającego wartość logiczną, aby wybrać blok skryptu do wykonania.

$var = @{A = 10; B = 'abc'}

foreach ($key in $var.Keys) {
    switch ($var[$key].GetType()) {
        { $_ -eq [int32]  }  { "$key + 10 = $($var[$key] + 10)" }
        { $_ -eq [string] }  { "$key = $($var[$key])"           }
    }
}
A + 10 = 20
B = abc

W tym przykładzie obiekt, który nie jest ciągiem ani danymi liczbowym, jest przekazywany do obiektu switch. Funkcja switch wykonuje wymuszanie ciągu na obiekcie i ocenia wynik.

$test = @{
    Test  = 'test'
    Test2 = 'test2'
}

$test.ToString()

switch -Exact ($test)
{
    'System.Collections.Hashtable'
    {
        'Hashtable string coercion'
    }
    'test'
    {
        'Hashtable value'
    }
}
System.Collections.Hashtable
Hashtable string coercion

W tym przykładzie nie ma pasującego przypadku, więc nie ma żadnych danych wyjściowych.

switch ("fourteen")
{
    1 {"It is one."; Break}
    2 {"It is two."; Break}
    3 {"It is three."; Break}
    4 {"It is four."; Break}
    "fo*" {"That's too many."}
}

Dodając klauzulę default , można wykonać akcję, gdy żadne inne warunki nie powiedzie się.

switch ("fourteen")
{
    1 {"It is one."; Break}
    2 {"It is two."; Break}
    3 {"It is three."; Break}
    4 {"It is four."; Break}
    "fo*" {"That's too many."}
    Default {
        "No matches"
    }
}
No matches

Aby wyraz "czternastu" był zgodny z przypadkiem, należy użyć parametru -Wildcard or -Regex .

   PS> switch -Wildcard ("fourteen")
       {
           1 {"It is one."; Break}
           2 {"It is two."; Break}
           3 {"It is three."; Break}
           4 {"It is four."; Break}
           "fo*" {"That's too many."}
       }
That's too many.

W poniższym przykładzie użyto parametru -Regex .

$target = 'https://bing.com'
switch -Regex ($target)
{
    '^ftp\://.*$' { "$_ is an ftp address"; Break }
    '^\w+@\w+\.com|edu|org$' { "$_ is an email address"; Break }
    '^(http[s]?)\://.*$' { "$_ is a web address that uses $($matches[1])"; Break }
}
https://bing.com is a web address that uses https

W poniższym przykładzie pokazano użycie bloków skryptu jako switch warunków instrukcji.

switch ("Test")
{
    {$_ -is [String]} {
        "Found a string"
    }
    "Test" {
        "This $_ executes as well"
    }
}
Found a string
This Test executes as well

Poniższy przykład przetwarza tablicę zawierającą dwie wartości daty. Właściwość <value-scriptblock> Year porównuje właściwość Year każdej daty. Zostanie <action-scriptblock> wyświetlony komunikat powitalny lub liczba dni do początku roku 2022.

switch ((Get-Date 1-Jan-2022), (Get-Date 25-Dec-2021)) {
    { $_.Year -eq 2021 } {
        $days = ((Get-Date 1/1/2022) - $_).days
        "There are $days days until 2022."
    }
    { $_.Year -eq 2022 } { 'Welcome to 2022!' }
}

Jeśli wartość jest zgodna z wieloma warunkami, wykonywana jest akcja dla każdego warunku. Aby zmienić to zachowanie, użyj break słów kluczowych lub continue .

Słowo break kluczowe zatrzymuje przetwarzanie i zamyka instrukcję switch .

Słowo continue kluczowe przestaje przetwarzać bieżącą wartość, ale kontynuuje przetwarzanie wszystkich kolejnych wartości.

Poniższy przykład przetwarza tablicę liczb i wyświetla, czy są dziwne, czy nawet. Liczby ujemne są pomijane za pomocą słowa kluczowego continue . Jeśli napotkano wartość inną niż liczba, wykonanie zostanie zakończone za pomocą słowa kluczowego break .

switch (1,4,-1,3,"Hello",2,1)
{
    {$_ -lt 0} { continue }
    {$_ -isnot [Int32]} { break }
    {$_ % 2} {
        "$_ is Odd"
    }
    {-not ($_ % 2)} {
        "$_ is Even"
    }
}
1 is Odd
4 is Even
3 is Odd

Zobacz też