about_Switch

Kısa açıklama

Birden çok if deyimi işlemek için anahtarın nasıl kullanılacağını açıklar.

Uzun açıklama

Betik veya işlevdeki bir koşulu denetlemek için deyimini if kullanın. deyimi if , değişkenlerin değeri ve nesnelerin özellikleri dahil olmak üzere birçok koşul türünü denetleyebilir.

Birden çok koşulu denetlemek için deyimini switch kullanın. deyimi switch bir dizi if deyimle eşdeğerdir, ancak daha basittir. deyimi her switch koşulu ve isteğe bağlı eylemi listeler. Bir koşul elde edilirse, eylem gerçekleştirilir.

deyimi switch ve $switch otomatik değişkenlerini kullanabilir$_. Daha fazla bilgi için bkz . about_Automatic_Variables.

Sözdizimi

Temel switch deyim aşağıdaki biçime sahiptir:

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

if Eşdeğer deyimler şunlardır:

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

<test-expression>, bir değer döndürmek için ifade modunda değerlendirilen tek bir ifadedir.

<result-to-be-matched> değeri giriş değeriyle karşılaştırılan bir ifadedir. İfadeler değişmez değerler (dizeler veya sayılar), değişkenler ve boole değeri döndüren betik blokları içerir.

Sayı olarak tanınmayan tüm sıralanmamış değerler dize olarak kabul edilir. Karışıklığı veya istenmeyen dize dönüştürmeyi önlemek için her zaman dize değerlerini tırnak içine almalısınız. İfadenin doğru değerlendirildiğinden emin olmak için tüm ifadeleri ()parantez içine alın ve alt ifadeler oluşturur.

Değerin karşılaştırma ifadesinin <result-to-be-matched> sol tarafında olduğunu anlamak önemlidir. Bu, sonucunun <test-expression> sağ tarafta olduğu ve karşılaştırma için sol taraftaki değerin türüne dönüştürülebileceği anlamına gelir. Daha fazla bilgi için bkz. about_Comparison_Operators

Değer default , başka eşleşme olmadığında kullanılan eylem için ayrılmıştır.

Otomatik $_ değişken, deyimine switch geçirilen ifadenin değerini içerir ve deyimleri kapsamında <result-to-be-matched> değerlendirme ve kullanım için kullanılabilir.

Deyimin tam switch söz dizimi aşağıdaki gibidir:

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

veya

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

Parametre kullanılmazsa, switch Exact parametresini kullanmakla aynı şekilde davranır. Değer için büyük/küçük harfe duyarlı olmayan bir eşleşme gerçekleştirir. Değer bir koleksiyonsa, her öğe göründüğü sırayla değerlendirilir.

Deyimi en switch az bir koşul deyimi içermelidir.

Yan default tümcesi, değer koşullardan herhangi biriyle eşleşmediğinde tetikleniyor. Deyimindeki if bir else yan tümceye eşdeğerdir. Her switch deyimde yalnızca bir default yan tümceye izin verilir.

switch aşağıdaki parametrelere sahiptir:

  • Joker karakter - Koşulun bir joker karakter dizesi olduğunu gösterir. Match yan tümcesi bir dize değilse, parametre yoksayılır. Karşılaştırma büyük/küçük harfe duyarlı değildir.
  • Tam - Bir dizeyse match yan tümcesinin tam olarak eşleşmesi gerektiğini gösterir. Match yan tümcesi bir dize değilse, bu parametre yoksayılır. Karşılaştırma büyük/küçük harfe duyarlı değildir.
  • CaseSensitive - Büyük/küçük harfe duyarlı bir eşleşme gerçekleştirir. Match yan tümcesi bir dize değilse, bu parametre yoksayılır.
  • File- Bir yerine bir dosyadan <test-expression>girdi alır. Birden çok Dosya parametresi dahil edilirse, yalnızca sonuncusu kullanılır. Dosyanın her satırı deyimi tarafından switch okunur ve değerlendirilir. Karşılaştırma büyük/küçük harfe duyarlı değildir.
  • Regex - Değerin koşulla normal ifade eşleştirmesini gerçekleştirir. Match yan tümcesi bir dize değilse, bu parametre yoksayılır. Karşılaştırma büyük/küçük harfe duyarlı değildir. Otomatik $matches değişken, eşleşen deyim bloğu içinde kullanılabilir.

Not

Regex ve Joker Karakter gibi çakışan değerler belirtilirken, belirtilen son parametre önceliklidir ve çakışan tüm parametreler yoksayılır. Birden çok parametre örneğine de izin verilir. Ancak, yalnızca listelenen son parametre kullanılır.

Örnekler

Aşağıdaki örnekte deyimi, switch 3 test değerini koşulların her biri ile karşılaştırır. Test değeri koşulla eşleştiğinde eylem gerçekleştirilir.

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

Bu basit örnekte değer, 3 değeri için bir eşleşme olsa bile listedeki her koşulla karşılaştırılır. Aşağıdaki switch deyim, 3 değeri için iki koşula sahiptir. Varsayılan olarak tüm koşulların test edilmiş olduğunu gösterir.

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.

bir eşleşmeden switch sonra karşılaştırmayı durdurmak için öğesini yönlendirmek için deyimini break kullanın. deyimi break deyimini switch sonlandırır.

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.

Test değeri dizi gibi bir koleksiyonsa, koleksiyondaki her öğe göründüğü sırayla değerlendirilir. Aşağıdaki örneklerde 4 ve sonra 2 değerlendirilir.

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.

Tüm break deyimler, aşağıdaki örnekte gösterildiği gibi her değere değil koleksiyona uygulanır. deyimi switch , 4 değerinin break koşulundaki deyimi tarafından sonlandırılır.

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.

Bu örnekte deyimi, switch karma tablodaki değerin türünü test etme işlemidir. Yürütülecek betik engellemesini seçmek için boole değeri döndüren ve ifadesini kullanmanız gerekir.

$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

Bu örnekte, dize veya sayısal veri olmayan bir nesne öğesine switchgeçirilir. nesnesi switch üzerinde bir dize zorlaması gerçekleştirir ve sonucu değerlendirir.

$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

Bu örnekte eşleşen bir büyük/küçük harf olmadığından çıkış yoktur.

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."}
}

yan tümcesini default ekleyerek, başka bir koşul başarılı olmadığında bir eylem gerçekleştirebilirsiniz.

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

"On dört" sözcüğünün bir servis talebiyle eşleşmesi için veya -Regex parametresini -Wildcard kullanmanız gerekir.

   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.

Aşağıdaki örnekte parametresi kullanılır -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

Aşağıdaki örnekte betik bloklarının deyim koşulları olarak switch kullanımı gösterilmektedir.

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

Aşağıdaki örnek, iki tarih değeri içeren bir diziyi işler. her <value-scriptblock> tarihin Year özelliğini karşılaştırır. , <action-scriptblock> bir karşılama iletisi veya 2022 yılının başına kadar olan gün sayısını görüntüler.

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!' }
}

Değer birden çok koşulla eşleşiyorsa, her koşul için eylem yürütülür. Bu davranışı değiştirmek için veya continue anahtar sözcüklerini kullanınbreak.

anahtar break sözcüğü işlemeyi durdurur ve deyiminden switch çıkar.

anahtar continue sözcüğü geçerli değeri işlemeyi durdurur, ancak sonraki değerleri işlemeye devam eder.

Aşağıdaki örnek bir sayı dizisini işler ve tek veya çift olup olmadığını görüntüler. Negatif sayılar anahtar sözcüğüyle continue atlanır. Sayı olmayan bir değerle karşılaşılırsa yürütme anahtar sözcüğüyle break sonlandırılır.

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

Ayrıca bkz.