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 skry 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 switch
jest równoważna serii instrukcji if
, ale jest prostsza. Instrukcja switch
zawiera listę każdego warunku i akcję opcjonalną. Jeśli warunek zostanie uzyskany, 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>}
<test-expression>
jest pojedynczym wyrażeniem, 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łu (ciągi lub liczby), zmienne i bloki skryptów, które zwracają wartość logiczną.
Każda niekwotowana wartość, 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. Ujmij dowolne wyrażenia w nawiasach ()
, tworząc podwyrażenia, aby upewnić się, że wyrażenie jest poprawnie oceniane.
Ważne jest, aby zrozumieć, że wartość <result-to-be-matched>
znajduje się po lewej stronie wyrażenia porównania. Oznacza to, że wynik <test-expression>
obiektu 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 używasz parametrów, 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
. Tylko jedna default
klauzula jest dozwolona w każdej switch
instrukcji.
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 jest bez uwzględniania wielkości liter.
- Exact — wskazuje, że klauzula match, jeśli jest to ciąg, musi być dokładnie zgodna. Jeśli klauzula match nie jest ciągiem, ten parametr jest ignorowany. Porównanie jest bez uwzględniania 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
<test-expression>
. Plik jest odczytywany w danym momencie i oceniany przez instrukcjęswitch
. Domyślnie porównanie jest niewrażliwe na wielkość liter. Parametr plik obsługuje tylko jeden plik. Jeśli uwzględniono wiele parametrów pliku , zostanie użyty tylko ostatni. Aby uzyskać więcej informacji, zobacz przykłady parametrów file. -
Regex — wykonuje wyrażenie regularne pasujące do wartości warunku. Jeśli klauzula match nie jest ciągiem, ten parametr jest ignorowany.
Porównanie jest bez uwzględniania wielkości liter. Zmienna automatyczna
$Matches
jest dostępna do użycia w bloku zgodnej 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. Jest jednak używany tylko ostatni parametr wymieniony.
Proste przykłady dopasowania
W poniższym przykładzie instrukcja switch
porównuje wartość testu 3
z każdym z warunków. Gdy wartość testu jest zgodna z warunkiem, wykonywana jest akcja.
switch (3) {
1 { "It's one." }
2 { "It's two." }
3 { "It's three." }
4 { "It's four." }
}
It's three.
W tym przykładzie wartość jest porównywana z każdym warunkiem na liście. Poniższa instrukcja switch
ma dwa warunki dla wartości 3, co pokazuje, że wszystkie warunki są testowane.
switch (3) {
1 { "It's one." }
2 { "It's two." }
3 { "It's three." }
4 { "It's four." }
3 { "Three again." }
}
It's 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's one." }
2 { "It's two." }
3 { "It's three."; break }
4 { "It's four." }
3 { "Three again." }
}
It's three.
Jeśli wartość testowa jest kolekcją, taką jak tablica, każdy element w kolekcji jest obliczany w kolejności, w jakiej się pojawia. W poniższych przykładach przedstawiono ocenę 4, a następnie 2.
switch (4, 2) {
1 { "It's one." }
2 { "It's two." }
3 { "It's three." }
4 { "It's four." }
3 { "Three again." }
}
It's four.
It's two.
Wszystkie break
instrukcje mają zastosowanie do 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's one."; break }
2 { "It's two." ; break }
3 { "It's three." ; break }
4 { "It's four." ; break }
3 { "Three again." }
}
It's four.
Bardziej złożone przykłady dopasowania
W tym przykładzie instrukcja switch
testuje typ wartości w tabeli skrótu. 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 przymus ciągu w 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's one."; break }
2 { "It's two."; break }
3 { "It's three."; break }
4 { "It's 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's one."; break }
2 { "It's two."; break }
3 { "It's three."; break }
4 { "It's four."; break }
"fo*" { "That's too many." }
default { "No matches" }
}
No matches
Aby wyraz fourteen
był zgodny z przypadkiem, należy użyć parametru -Wildcard
lub -Regex
.
switch -Wildcard ("fourteen") {
1 { "It's one."; break }
2 { "It's two."; break }
3 { "It's three."; break }
4 { "It's 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 zatrzymuje przetwarzanie bieżącej wartości, 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 nieliczebną liczbę, 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
Przykłady parametrów pliku
Użycie instrukcji switch
z parametrem file jest wydajnym sposobem przetwarzania wierszy dużych plików według wiersza. Program PowerShell przesyła strumieniowo wiersze pliku do instrukcji switch
. Każdy wiersz jest przetwarzany indywidualnie.
Przetwarzanie można zakończyć przed osiągnięciem końca pliku przy użyciu słowa kluczowego break
w instrukcji action. Instrukcja switch
jest wydajniejsza niż używanie Get-Content
do przetwarzania dużych plików wiersz po wierszu.
Można połączyć switch -File
z -Wildcard
lub -Regex
w celu elastycznego i wydajnego dopasowywania wzorców liniowych.
Poniższy przykład odczytuje README.md
w repozytorium PowerShell-Docs.
Zwraca on dane wyjściowe każdego wiersza, dopóki nie osiągnie wiersza rozpoczynającego się od ##
.
switch -Regex -File .\README.md {
'^##\s' { break }
default { $_; continue }
}
Argument <filename>
jest interpretowany jako wyrażenie wieloznaczne, ale musi być zgodny tylko z jednym plikiem. Poniższy przykład jest taki sam jak poprzedni, z wyjątkiem użycia symbolu wieloznakowego w argumencie <filename>
. Ten przykład działa, ponieważ wzorzec wieloznaczny pasuje tylko do jednego pliku.
switch -Regex -File .\README.* {
'^##\s' { break }
default { $_; continue }
}
Należy użyć znaków ucieczki, które mogą być interpretowane jako symbole wieloznaczne, jeśli chcesz, aby były traktowane jako literały.
$file = (New-Item -Path 'Temp:\Foo[0]' -Value Foo -Force).FullName
switch -File $file { Foo { 'Foo' } }
# No files matching '...\Temp\Foo[0]' were found.
$fileEscaped = [WildcardPattern]::Escape($file)
switch -File $fileEscaped { foo { 'Foo' } }
# Foo