天天看点

Power Shell 学习笔记(六)流程控制语句之分支语句

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”

}

Power Shell 学习笔记(六)流程控制语句之分支语句
Power Shell 学习笔记(六)流程控制语句之分支语句
Power Shell 学习笔记(六)流程控制语句之分支语句
备注:IF相对比较简单,需要注意的是,elseif要连在一起写,不能分卡~      
1.2 switch      
switch就比较麻烦了.      

如果要通过 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好用啊~