天天看點

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