共用方式為


about_Switch

簡短描述

說明如何使用 參數來處理多個 if 語句。

完整描述

若要檢查文稿或函式中的條件,請使用 if 語句。 if語句可以檢查許多類型的條件,包括變數的值和對象的屬性。

若要檢查多個條件,請使用 switch 語句。 switch語句相當於一系列if語句,但更簡單。 switch語句會列出每個條件和選擇性動作。 如果條件取得,則會執行動作。

switch語句可以使用 $_$switch 自動變數。 如需詳細資訊,請參閱 about_Automatic_Variables

Syntax

基本 switch 語句的格式如下:

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

對等 if 的語句包括:

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

是在 <test-expression> 表達式模式中評估以傳回值的單一表達式。

<result-to-be-matched>是表達式,其值會與輸入值進行比較。 表達式包含常值 (字串或數位) 、變數和傳回布爾值的 scriptblock。

任何無法辨識為數位的未批註值,都會被視為字串。 若要避免混淆或非預期的字串轉換,您應該一律將字串值加上引號。 以括弧 ()括住任何表達式,以建立子表達式,以確保正確評估表達式。

請務必瞭解值 <result-to-be-matched> 位於比較表達式的左側。 這表示 的結果 <test-expression> 位於右側,可轉換成左側值的型別以進行比較。 如需詳細資訊,請參閱 about_Comparison_Operators

default 會保留給沒有其他相符專案時所使用的動作。

$_自動變數包含傳遞至 switch 語句的表達式值,可用於評估及使用 語句的範圍<result-to-be-matched>

完整的 switch 語句語法如下所示:

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

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

如果未使用任何參數, switch 則行為與使用 Exact 參數的行為相同。 它會針對值執行不區分大小寫的比對。 如果值是集合,則會依出現的順序評估每個元素。

switch語句必須至少包含一個條件語句。

default當值不符合任何條件時,就會觸發 子句。 它相當於 else 語句中的 if 子句。 每個switch語句中只允許一個default子句。

switch 具有下列參數:

  • 通配符 - 指出條件是通配符字串。 如果 match 子句不是字串,則會忽略 參數。 此比較不區分大小寫。
  • Exact - 指出 match 子句如果它是字串,則必須完全相符。 如果 match 子句不是字串,則會忽略此參數。 此比較不區分大小寫。
  • CaseSensitive - 執行區分大小寫的比對。 如果 match 子句不是字串,則會忽略此參數。
  • File- 從檔案取得輸入,而不是 <test-expression>。 如果包含多個 檔案 參數,則只會使用最後一個參數。 語句會讀取和評估 switch 檔案的每一行。 此比較不區分大小寫。
  • Regex - 執行值與條件的正則表示式比對。 如果 match 子句不是字串,則會忽略此參數。 此比較不區分大小寫。 自動 $matches 變數可用於比對語句區塊內。

注意

指定衝突的值時,例如 Regex通配符,指定的最後一個參數會優先使用,而且會忽略所有衝突的參數。 也允許多個參數實例。 不過,只會使用列出的最後一個參數。

範例

在下列範例中,語句會將 switch 測試值 3 與每個條件進行比較。 當測試值符合條件時,會執行動作。

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

在此簡單範例中,值會與清單中的每個條件進行比較,即使值 3 相符也一樣。 下列 switch 語句有兩個值為 3 的條件。 它示範預設會測試所有條件。

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.

若要指示 switch 停止比對之後的 比較,請使用 break 語句。 break語句會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.

如果測試值是集合,例如陣列,則集合中的每個項目都會依顯示的順序進行評估。 下列範例會評估 4,然後評估 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.

任何 break 語句都會套用至集合,而非每個值,如下列範例所示。 switch語句會在值 4 的條件中由 語句終止break

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.

在這裡範例中,不是字串或數值資料的物件會傳遞至 switch。 會在 switch 物件上執行字串強制型轉,並評估結果。

$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

在此範例中,沒有相符的案例,因此沒有輸出。

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 子句,您可以在沒有其他條件成功時執行動作。

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

若要讓 「fourteen」 一詞符合大小寫,您必須使用 -Wildcard-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.

下列範例會使用 -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

下列範例示範如何使用腳本區塊作為 switch 語句條件。

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

下列範例會處理包含兩個日期值的陣列。 會 <value-scriptblock> 比較每個日期的 Year 屬性。 會顯示 <action-scriptblock> 歡迎訊息或 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!' }
}

如果值符合多個條件,則會執行每個條件的動作。 若要變更此行為,請使用 breakcontinue 關鍵詞。

關鍵詞 break 會停止處理並結束 switch 語句。

關鍵詞 continue 會停止處理目前的值,但會繼續處理任何後續的值。

下列範例會處理數位數位,並顯示它們是否為奇數或偶數。 使用 關鍵詞略過 continue 負數。 如果遇到非數位,則會使用 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

另請參閱