Aracılığıyla paylaş


Switch hakkında

Kısa açıklama

Birden çok koşullu 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 kullanabilirsiniz. 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 kullanabilirsiniz. deyimi switch , bir dizi if deyime benzer, ancak daha basittir. deyimi her switch koşulu ve buna karşılık gelen eylemi listeler. Bir koşul eşleşirse, eylem gerçekleştirilir.

Önemli

deyimi, switch karşılaştırmadan önce tüm değerleri dizelere dönüştürür.

Sözdizimi

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

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

Bir switch deyiminin söz dizimi aşağıdaki if deyimlere benzer:

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

İfadeler değişmez değerler (dizeler veya sayılar), değişkenler ve boole değeri döndüren betik blokları içerir. deyimi, switch karşılaştırmadan önce tüm değerleri dizelere dönüştürür. Bir örnek için bu makalenin devamında yer alan Dize dönüştürmenin etkisi bölümüne bakın.

<test-expression> ifadesi ifade modunda değerlendirilir. İfade bir dizi veya başka bir numaralandırılabilir tür gibi birden fazla değer döndürürse, switch deyimi her numaralandırılmış değeri ayrı ayrı değerlendirir.

<result-to-be-matched> ifadesi tek bir değere çözümlenmelidir. Bu değer giriş değeriyle karşılaştırılır.

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

deyimi switch ve $_ otomatik değişkenlerini kullanabilir$switch. 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. Daha fazla bilgi için bkz . about_Automatic_Variables.

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
}

Parametreleri kullanmıyorsanız, switchExact 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.

default yan tümcesi, değer koşullardan herhangi biriyle eşleşmediğinde tetikler. else deyimindeki bir if yan tümcesine eşdeğerdir. Her default deyimde yalnızca bir switch 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, parametresi yoksayılır. Karşılaştırma büyük/küçük harfe duyarlı değildir.
  • Tam - Bir dizeyse eşleştirme 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.
  • Dosya - <test-expression>yerine bir dosyadan girdi alır. Dosya bir kerede bir satır okunur ve switch deyimi tarafından değerlendirilir. Varsayılan olarak, karşılaştırma büyük/küçük harfe duyarlı değildir. Dosya parametresi yalnızca bir dosyayı destekler. Birden çok Dosya parametresi dahil edilirse, yalnızca sonuncusu kullanılır. Daha fazla bilgi için bkz. Dosya parametresi örnekleri.
  • 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 örneklerde deyiminin kullanımı gösterilmektedir switch .

Basit eşleşme örnekleri

Aşağıdaki örnekte, switch deyimi 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's one."   }
    2 { "It's two."   }
    3 { "It's three." }
    4 { "It's four."  }
}
It's three.

Bu örnekte, değer listedeki her koşulla karşılaştırılır. Aşağıdaki switch deyimi, tüm koşulların test edilmiş olduğunu gösteren 3 değeri için iki koşula sahiptir.

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.

Akışı denetlemek için ve break kullanın continue

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 break anahtar sözcüklerini kullanıncontinue.

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

Dize dönüştürmenin etkisi

Hem giriş hem de karşılaştırma değeri olan tüm değerler karşılaştırma için dizelere dönüştürülür. İstenmeyen dize dönüştürmeyi önlemek için anahtar değerini değerlendirmek için betik bloklarını kullanın.

switch ( ([datetime]'1 Jan 1970').DayOfWeek ) {
    4            { 'The integer value matches a Thursday.' }
    "4"          { 'The numeric string matches a Thursday.' }
    "Thursday"   { 'The string value matches a Thursday.' }
    { 4 -eq $_ } { 'The expression matches a Thursday.' }
}

Date nesnesinin DayOfWeek özelliği bir numaralandırmadır. Numaralandırmalar sayısal veya dize değerleriyle karşılaştırılabilir, switch ancak deyimi değeri numaralandırmanın dize gösterimine dönüştürür.

The string value matches a Thursday.
The expression matches a Thursday.

Bu davranış, bir -eq deyimdeki karşılaştırma davranışından if farklıdır.

if (4 -eq ([datetime]'1 Jan 1970').DayOfWeek) {
    'The integer value matches a Thursday.'
}
The value matches a Thursday.

Bu örnekte, deyimine switch bir karma tablo geçirilir. , switch hashtable'ı bir dizeye dönüştürür.

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

$test.ToString()
System.Collections.Hashtable

Karma tablo dize gösteriminin Test anahtarının değeriyle aynı olmadığını fark edin.

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

Karma tablodaki değerleri test etmek için kullanın switch

Bu örnekte deyimi, switch karma tablodaki değerin türünü test etme işlemidir. Değerleri test etmeden önce karma tablodaki öğeleri listelememiz gerekir. Dize dönüştürmenin karmaşıklıklarını önlemek için, yürütülecek eylem betik bloğunu seçmek için boole değeri döndüren bir betik bloğu kullanın.

$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

Joker karakter kullanma switch

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

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

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

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

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

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.

ile normal ifadeleri kullanma switch

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

Dosyasının içeriğini şu şekilde okuma: switch

switch parametresiyle deyimini kullanmak, büyük dosyaları satır satır işlemenin verimli bir yoludur. PowerShell, dosyanın satırlarını switch deyimine akışla aktarır. Her satır ayrı ayrı işlenir.

eylem deyimindeki break anahtar sözcüğünü kullanarak dosyanın sonuna ulaşmadan önce işlemeyi sonlandırabilirsiniz. switch deyimi, büyük dosyaları satır satır işlemek için Get-Content kullanmaktan daha verimlidir.

Esnek ve verimli satır satır desen eşleştirme için switch -File-Wildcard veya -Regex birleştirebilirsiniz.

Aşağıdaki örnek, PowerShell-Docs deposundaki README.md okur. ##ile başlayan satıra ulaşana kadar her satırın çıkışını alır.

switch -Regex -File .\README.md {
    '^##\s' { break }
    default { $_; continue }
}

<filename> bağımsız değişkeni joker karakter ifadelerini kabul eder, ancak yalnızca bir dosyayla eşleşmesi gerekir. Aşağıdaki örnek, <filename> bağımsız değişkeninde joker karakter kullanması dışında öncekiyle aynıdır. Joker karakter deseni yalnızca bir dosyayla eşleştiğinden bu örnek çalışır.

switch -Regex -File .\README.* {
    '^##\s' { break }
    default { $_; continue }
}

Sabit değer olarak değerlendirilmelerini istiyorsanız joker karakter olarak yorumlanacak kaçış karakterleri kullanmanız gerekir.

$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

Ayrıca bakınız