about_Switch

主题
    about_Switch

简短说明
    说明如何使用 switch 来处理多个 IF 语句。

详细说明
    您可以在脚本或程序中使用 If 语句来作出决定。实质上,它表示:"如果此条件存在,则执行此操作。否
    则执行另一操作。"您可以无限次执行这样的条件运算,但如果条件列表过长,If 语句用起来会非常不
    便。可以将很长的条件列表组合到一个 switch 语句中。与在所有分支语句中一样,必须用大括号 ({}) 将
    脚本块括起来。

    一条 switch 语句实际上等效于一系列 If 语句。它将表达式与每个条件逐一进行匹配。如果找到匹配
    项,即执行与该条件相关联的操作。基本的 switch 语句形式如下:

        PS> $a = 3
        PS> switch ($a) {
            1 {"It is one."}
            2 {"It is two."}
            3 {"It is three."}
            4 {"It is four."}
            }
        
        It is three.


    这一简单的示例获取一个值,并将该值与列表中的每个条件进行比较。执行的操作是根据匹配情况
    回显一个字符串。但是,如果每个条件都检查,可能会遇到问题。例如:

        PS> $day = "day5"
        PS> switch ($day){
            day1 {"Monday"; break}
            day2 {"Tuesday"; break}
            day3 {"Wednesday"; break}
            day4 {"Thursday"; break}
            day5 {"Friday"; break}
            day6 {"Saturday"; break}
            day7 {"Sunday"; break}
            day5 {"Too many days"; break}
            }
        
        Friday


    此列表中有两个 day5 条件。但是每个条件最后的 break 指示 switch 停止进一步查找,并执行所找到的
    操作。如果没有 break 语句,那么两个 day5 操作都将执行。

    如果要通过 switch 获取的值是一个数组,那么将从元素 0 开始按顺序计算该数组中的每个元素。至少必
    须存在满足至少一个条件的元素,否则将发生错误。如果存在多个默认子句,将发生错误。

    完整的 switch 语法如下:

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

        switch [-regex|-wildcard|-exact][-casesensitive] -file filename

    后跟

        { 
            "string"|number|variable|{ expression } { statementlist } 
            default { statementlist }
        }

    
    默认情况下,如果未使用任何参数,那么 Switch 按采用"不区分大小写的精确匹配"进行操作。如果
    "pipeline"的结果为数组,那么将从 0(零)开始按偏移升序依次对数组中的每个元素进行计算。

    Switch 代码块中必须至少存在一个条件元素,并且只能存在一个 default 子句。如果存在多个 
    default 子句,将引发 ParseException 异常。

    Switch 具有以下参数:

        Regex           指示如果匹配子句为字符串,则将其视为正则表达式字符串。使用
                此参数将禁用 Wildcard 和 Exact。如果匹配子句不是字符串,将忽略此参数。

        Wildcard    指示如果匹配子句为字符串,则将其视为通配符字符串。使用此参数将禁用 Regex 和 
                Exact。如果匹配子句不是字符串,将忽略此参数。

        Exact           指示如果匹配子句为字符串,则必须精确匹配。使用此参数将禁用 Wildcard 和 Regex。
            如果匹配子句不是字符串,将忽略此参数。

        CaseSensitive   如果匹配子句为字符串,则将它修改为区分大小写。如果匹配子句不是字符串,将忽略此参数。

        File            从文件(或样本)而不是从语句获取输入。如果使用了多个 File 参数,
            则使用最后一个参数。读取文件中的每一行,并对其执行 switch 块。

    允许多次使用 Regex、Wildcard 或 Exact。但是,只有使用的最后一个参数控制 Switch 的行为。

    关键字 Break 指示不再执行任何处理,Switch 语句将退出。

    关键字 Continue 指示在当前令牌下将不再继续执行任何处理,而将计算条件中的下一个令牌。如果没有
    可用的令牌,Switch 语句将退出。

    "{ expression }"块可以是将在比较时进行计算的代码块。当前对象绑定到自动变量"$_",且在计
    算表达式时可用。如果表达式计算结果为"True",则比较将被视为匹配。此表达式在新作用域中进行计算。

    Switch 语句中的"Default"关键字指示如果未找到匹配项,则计算该关键字之后的代码块。块与块之
    间不允许存在程序流,因为复合列表中的右括号 (}) 就是一个显式的 break。

    如果找到多个匹配项,每个匹配项都会导致表达式被执行。为避免发生这种情况,可以使用 Break 或 
    Continue 关键字停止进一步的比较。


另请参阅
    about_Break
    about_Continue
    about_If
    about_Script_Blocks