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