Power Shell 本身是一种系统脚本,那么当然常见的流程控制语句是有的。这次我们来看看分支语句。
PS目前支持分支语句有IF和Switch两种,相信学习过任意一门开发语言的人都不会感到陌生,甚至一读就懂。
1.1 if
语法
以下示例说明 If 语句的语法:
if ()
{}
[elseif ()
{}]
[else
{}]
这个结构并不陌生吧,与JAVA和DoNET一样。
为避免无聊,找了一段稍微~复杂点的代码,通过调用DoNet类库的方式,通过对话框获得键盘输入,然后走if语句
题目很简单,输入成绩,输出ABCDE。
$null = [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$form = New-Object Windows.Forms.Form
$form.Size = New-Object Drawing.Size -arg 300,85
$textBox = New-Object Windows.Forms.textBox
$textBox.Dock = "Fill"
$form.Controls.Add($textBox)
$button = New-Object Windows.Forms.Button
$button.Text = "Done"
$button.Dock = "Bottom"
$button.add_Click(
{$global:resultText = $textBox.Text;$form.Close()})
$form.Controls.Add($button)
[Void] $form.ShowDialog()#------------上述代码通过调用Forms类库,创建Form对象,并且添加了TextBox控件,然后show出来。------------------
if ($global:resultText –ge 80)
{
Write “A”
}
elseif ($global:resultText –ge 60)
{
write “B”
}
else
{
write “C”
}备注:IF相对比较简单,需要注意的是,elseif要连在一起写,不能分卡~
如果要通过 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 的行为。
一条 switch 语句实际上等效于一系列 If 语句。它将表达式与每个条件逐一进行匹配。如果找到匹配
项,即执行与该条件相关联的操作。基本的 switch 语句形式如下(很奇怪的看到不需要break):
1 |
PS> $a = 3 |
2 |
PS> switch ($a) { |
3 |
1 {"It is one."} |
4 |
2 {"It is two."} |
5 |
3 {"It is three."} |
6 |
4 {"It is four."} |
7 |
} |
8 |
9 |
It is three. |
这一简单的示例获取一个值,并将该值与列表中的每个条件进行比较。执行的操作是根据匹配情况
回显一个字符串。但是,如果每个条件都检查,可能会遇到问题。例如(这个更奇怪,居然可以有相同的expression):
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
可以使用CaseSensitive区分大小写:
01 |
PS> $day = "Day5" |
02 |
PS> switch -CaseSensitive ($day){ |
03 |
day1 {"Monday"} |
04 |
day2 {"Tuesday"} |
05 |
day3 {"Wednesday"} |
06 |
day4 {"Thursday"} |
07 |
Day5 {"Friday"} |
08 |
day6 {"Saturday"} |
09 |
day7 {"Sunday"} |
10 |
day5 {"Too many days"} |
11 |
} |
Friday
正则表达式匹配:
1 |
PS> $day = "day5" |
2 |
PS> switch -regex ($day){ |
3 |
^[a-z]+$ {"字母,匹配为:" + $_; break} |
4 |
^[/d]+$ {"数字,匹配为:" + $_; break} |
5 |
^/w+$ {"字母+数字,匹配为:" + $_; break} |
6 |
} |
7 |
|
8 |
字母+数字,匹配为:day5 |
正则表达式匹配多个:
01 |
$day = "day5","day6" |
02 |
switch -regex ($day){ |
03 |
^[a-z]+$ {"字母,匹配为:" + $_; } |
04 |
^[/d]+$ {"数字,匹配为:" + $_; } |
05 |
^/w+$ {"字母+数字,匹配为:" + $_; } |
06 |
} |
07 |
|
08 |
字母+数字,匹配为:day5 |
09 |
|
10 |
字母+数字,匹配为:day6 |
通配符(*)匹配:
1 |
$day = "day5" |
2 |
switch -Wildcard ($day){ |
3 |
day2 {"day2,匹配为:" + $_; } |
4 |
day3 {"day3,匹配为:" + $_; } |
5 |
day* {"通配符,匹配为:" + $_; } |
6 |
} |
Switch 比较复杂,所以感觉其实还是IF好用啊~