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要連在一起寫,不能分卡~
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好用啊~