共用方式為


about_Switch

主題
    about_Switch

簡短描述
    說明如何使用 switch 處理多個 If 陳述式。

完整描述
    指令碼或程式常利用 If 陳述式決定執行流程。 基本上,其用意是「若此條件為真,即執
    行這個動作。 否則就執行那個動作」。您可以視需要多次執行這類作業,但如果條件太多,
    If 陳述式將顯得過於繁雜。 使用 switch 陳述式則可結合較長的條件清單。 和所有的分支
    陳述式一樣,必須使用大括號 ({}) 括住指令碼區塊。

    Switch 陳述式的實質效果有如一系列的 If 陳述式。 此陳述式會將運算式與每項條件逐
    一進行比對。 如果找到相符項目,便會執行該條件的相關動作。 基本 switch 陳述式採
    用下列格式:

        PS> $a = 3
        PS> switch ($a) {
            1 {"這是一。"}
            2 {"這是二。"}
            3 {"這是三。"}
            4 {"這是四。"}
            }
        
        這是三。


    這個簡單的範例將變數值與清單中的每項條件進行比較, 而採取的動作會顯示相符項目的
    對應字串。 不過,如果您檢查所有條件,可能就會發現問題。 例如:

        PS> $day = "day5"
        PS> switch ($day){
            day1 {"星期一"; break}
            day2 {"星期二"; break}
            day3 {"星期三"; break}
            day4 {"星期四"; break}
            day5 {"星期五"; break}
            day6 {"星期六"; break}
            day7 {"星期日"; break}
            day5 {"太多天"; break}
            }
        
        星期五


    清單中有兩項條件都是 day5。 但是,每項條件結尾的 break 會指示 switch 找到相符項目
    後即停止,並且執行找到的動作。 如果沒有 break 陳述式,便會執行這兩個 day5 動作。 

    如果 switch 檢查的值是陣列,則會從元素 0 (零) 開始依序評估陣列中的每個元素。 至
    少應有一個元素至少符合一項條件,否則將產生錯誤。 default 子句若不止一個也會發生錯
    誤。

    完整的 switch 語法如下所示:

        switch [-regex|-wildcard|-exact][-casesensitive] ( 管線 ) 
    或

        switch [-regex|-wildcard|-exact][-casesensitive] -file 檔名

    後面接著

        { 
            "字串"|數字|變數|{ 運算式 } { 陳述式清單 } default { 陳述式清單} 
        }

    
    根據預設,如果未使用參數,則 Switch 的行為會像是執行不區分大小寫的完全相符比對。 
    如果「管線」產生陣列,則將以遞增位移順序逐一評估陣列中的每個元素 (從 0 [零] 開始)。  

    Switch 程式碼區塊內至少必須有一個條件元素,而且只能有一個 default 子句。 若有
    一個以上的 default 子句,將會發生 ParseException 例外狀況。

    Switch 具有下列參數:

        Regex           表示比對子句若是字串,則視為規則運算式字串。 使用
                        此參數會停用 Wildcard 和 Exact。 如果比對子句不是字串,則會忽略此參數。

        Wildcard    表示比對子句若是字串,則視為萬用字元字串。 使用此參數會停用 
                        Regex 和 Exact。 如果比對子句不是字串,則會忽略此參數。

        Exact           表示比對子句若是字串,則必須完全相符。 使用此參數
                        會停用 Wildcard 和 Regex。 如果比對子句不是字串,則會忽略此參數。

        CaseSensitive   比對子句若是字串,則會將其修改為區分大小寫。 如果比對子
                        句不是字串,則會忽略此參數。

        File            從檔案 (或足以代表檔案者) 取得輸入,而不是從陳述式。 如果有多個 File 參數,
                        則會使用最後一個。 會讀取檔案的每一行並傳入 switch 區塊。

    允許使用多個 Regex、Wildcard 或 Exact, 但陳述式的行為僅由最後一個參數所控制。

    Break 關鍵字表示不再繼續處理,將會立即結束 Switch 陳述式。 

    Continue 關鍵字表示不再繼續處理目前的語彙基元,並且將評估條件中的下一個語彙基
    元。 如果沒有可評估的語彙基元,將會結束 Switch 陳述式。

    "{ 運算式 }" 區塊是進行比較時所要評估的程式碼區塊。 目前物件會繫結至 $_ 自動變
    數,可供運算式評估期間使用。 如果運算式評估為 "True",比較結果即視為相符。 此運
    算式將於新範圍內進行評估。

    switch 陳述式內的 "Default" 關鍵字表示,若找不到相符項目,則評估此關鍵字後面
    的程式碼區塊。 程式流程無法從某一區塊跳到另一區塊,因為複合清單中的右括號 ( } ) 
    明示為 break。 

    如果找到多個相符項目,就會執行每個相符項目的對應運算式。 為避免發生這種情形,可
    以使用 Break 或 Continue 關鍵字停止繼續比較。


請參閱
    about_Break
    about_Continue
    about_If
    about_Script_Blocks