Anahtar hakkında


Kısa açıklama

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

Uzun açıklama

Bir komut dosyasındaki veya işlevdeki bir koşulu kontrol etmek için if ifadesini kullanın. if ifadesi, değişkenlerin değeri ve nesnelerin özellikleri de dahil olmak üzere birçok koşul türünü kontrol edebilir.

Birden fazla koşulu kontrol etmek için switch ifadesini kullanın. switch ifadesi bir dizi if ifadesine eşdeğerdir ancak daha basittir. switch ifadesi her koşulu ve isteğe bağlı bir eylemi listeler. Eğer bir koşul sağlanırsa eylem gerçekleştirilir.

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

Sözdizimi

Temel bir switch ifadesi aşağıdaki formata sahiptir:

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

Eşdeğer if ifadeleri ş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 ifadedir.

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

Sayı olarak tanınmayan, tırnak içine alınmamış herhangi bir değer dize olarak değerlendirilir. Karışıklığı veya istenmeyen dize dönüşümünü önlemek için her zaman dize değerlerini alıntılamalısınız. İfadenin doğru şekilde değerlendirildiğinden emin olmak için tüm ifadeleri parantez () içine alın ve alt ifadeler oluşturun.

<result-to-be-matched> değerinin karşılaştırma ifadesinin sol tarafında olduğunu anlamak önemlidir. Bu, <test-expression> sonucunun 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

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

$_ otomatik değişkeni, switch ifadesine iletilen ifadenin değerini içerir ve <result-to- kapsamında değerlendirme ve kullanıma açıktır. be-matched> ifadeleri.

switch ifadesinin tam sözdizimi 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
}

Hiçbir parametre kullanılmıyorsa switch, Exact parametresinin kullanılmasıyla 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ıraya göre değerlendirilir.

switch ifadesi en az bir koşul ifadesi içermelidir.

Değer koşulların hiçbiriyle eşleşmediğinde default yan tümcesi tetiklenir. Bir if ifadesindeki else yan tümcesine eşdeğerdir. Her switch ifadesinde yalnızca bir default yan tümcesine izin verilir.

switch aşağıdaki parametrelere sahiptir:

  • Joker karakter - Koşulun bir joker karakter dizesi olduğunu belirtir. Match yan tümcesi bir dize değilse parametre dikkate alınmaz. Karşılaştırma büyük/küçük harfe duyarlı değildir.
  • Tam - Bir dize ise, eşleşme yan tümcesinin tam olarak eşleşmesi gerektiğini belirtir. 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.
  • Büyük/Küçük Harfe Duyarlı - 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.
  • Dosya- Girişi <test-expression> yerine bir dosyadan alır. Birden fazla Dosya parametresi dahil edilirse yalnızca sonuncusu kullanılır. Dosyanın her satırı switch ifadesi tarafından okunur ve değerlendirilir. Karşılaştırma büyük/küçük harfe duyarlı değildir.
  • Regex - Değerin koşulla normal ifadeyle eşleşmesini 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. $matches otomatik değişkeni, eşleşen ifade bloğunda kullanıma uygundur.

Not

Regex ve Wildcard gibi çakışan değerler belirtilirken, belirtilen son parametre öncelikli olur ve çakışan tüm parametreler göz ardı edilir. Birden fazla parametre örneğine de izin verilir. Ancak yalnızca listelenen son parametre kullanılır.

Örnekler

Aşağıdaki örnekte, switch ifadesi test değeri olan 3'ü her bir koşulla 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, 3 değeri için bir eşleşme olsa bile değer listedeki her koşulla karşılaştırılır. Aşağıdaki switch deyiminde 3 değeri için iki koşul vardır. , varsayılan olarak tüm koşullar test edilir.

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 sonra switch'i karşılaştırmayı durdurmaya yönlendirmek için break ifadesini kullanın. break ifadesi switch ifadesini 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 bir dizi gibi bir koleksiyonsa, koleksiyondaki her öğe göründüğü sıraya göre değerlendirilir. Aşağıdaki örnekler 4'ü ve ardından 2'yi değerlendirir.

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.

Aşağıdaki örnekte gösterildiği gibi herhangi bir break ifadesi her değere değil koleksiyona uygulanır. switch ifadesi, değer 4 koşulunda break ifadesi ile 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, switch ifadesi karma tablosundaki değerin türünü test ediyor. Yürütülecek komut dosyası bloğunu seçmek için bir boole değeri döndüren ifadeyi 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 anahtara aktarılır. anahtar, nesne ü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 durum olmadığından çıktı da 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."}
}

default yan tümcesini ekleyerek, başka hiç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" kelimesinin büyük/küçük harfle eşleşmesi için -Wildcard veya -Regex parametresini 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 -Regex parametresi kullanılmaktadır.

$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 örnek, komut dosyası bloklarının switch ifadesi koşulları olarak kullanımını gösterir.

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. <value-scriptblock> her tarihin Yıl özelliğini karşılaştırır. <action-scriptblock> bir hoş geldiniz mesajını veya 2022 yılının başına kalan 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 fazla koşulla eşleşiyorsa her koşula ilişkin eylem yürütülür. Bu davranışı değiştirmek için break veya continue anahtar kelimelerini kullanın.

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

continue anahtar sözcüğü geçerli değerin işlenmesini durdurur ancak sonraki değerlerin işlenmesine devam eder.

Aşağıdaki örnek, bir sayı dizisini işler ve bunların tek mi yoksa çift mi olduğunu görüntüler. Negatif sayılar devam et anahtar sözcüğüyle atlanır. Sayı olmayan bir sayıyla karşılaşılırsa yürütme break anahtar sözcüğüyle 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 bakınız

  • about_Break
  • about_Devam
  • about_If
  • about_Script_Blocks

İlgili makaleler