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”
}

 
   
 
   
 
   
备注: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好用啊~

你可能感兴趣的:(Power Shell 学习笔记(六)流程控制语句之分支语句)