Windows PowerShell 講座 (7)—運算子(下)
發佈日期: 2008 年 5 月 13 日
**作者:**賴榮樞
www.goodman-lai.idv.tw
本文將繼續介紹 Windows PowerShell 所提供的運算子,這些實用的運算子將資料的處理有很大的幫助。
邏輯運算子
位元運算子
替代運算子
型別運算子
範圍運算子
格式運算子
結語
補述其他的運算子之前先提醒您,包括上一篇文章介紹的比較運算,以及本文即將說明的邏輯運算、型別運算,其結果都是 True 或 False 的布林值,因此在需要條件判斷的地方,經常會使用這類的運算;例如資料過濾的條件式,或者是迴圈、流程控制等。
如果要評估兩個以上的條件式,就是使用邏輯運算子的時機。例如:
2008 年 4 月 1 日產生「而且」識別碼為 672 的事件記錄
副檔名為 log「而且」512 KB 以上的檔案
使用者名稱為 SYSTEM「或者」NETWORK SERVICE 的行程
Windows PowerShell 提供了四種邏輯運算子,其中反閘有兩種表示法,可以用文字的 - not,或者是符號 !,不論哪一種,反閘的作用就是將 True 變成 False,或將 False 變成 True。這些運算子列表如下。
運算子 |
說明 |
簡例 |
結果 |
---|---|---|---|
-and |
及閘,所有運算式都必須為 True,結果才會是 True。 |
(3 -eq 3) -and (2 -eq 5) |
False |
-or |
或閘,至少要有一個運算式為 True,結果就會是 True。 |
(3 -eq 3) -or (2 -eq 5) |
True |
-xor |
互斥閘,只有其中一個運算式為 True,結果才會是 True。 |
(3 -eq 3) -xor (2 -eq 2) |
False |
-not(!) |
反閘,逆轉運算結果。 |
(3 -eq 3) -and !(2 -eq 5) |
True |
資料過濾應該算是比較運算和邏輯運算最實際的應用,我們在利用 Windows PowerShell 的 cmdlet 時,其執行結果經常會得到相當大量的資料,如果要以肉眼檢視結果,往往很困難,有時甚至會因為資料量實在太大而不可能以肉眼檢視。因此必須再藉由另一段指令碼來過濾資料。
Where-Object(別名為 Where)是經常用來過濾資料的 cmdlet,而過濾資料的條件式就會用到(上一篇文章)介紹到的比較運算子;有些較為複雜的過濾,就需要用到這裡提及的邏輯運算子。
例如以下兩個片段的例子,都各有兩個條件式,但第一個必須同時符合兩個條件式,第二個則只要符合其中一個條件式:
# 找出日期為 2008 年 4 月 1 日,「而且」識別碼為 672 的事件記錄 date - match "2008/4/1" -and ID -eq "672" # 使用者名稱為 SYSTEM「或者」NETWORK SERVICE 的行程 UserID -eq "SYSTEM" -or UserID -eq "NETWORK SERVICE"
如果需要位元運算,Windows PowerShell 也提供了四種基本的位元運算子,這些運算子都是以代表位元的 b 開頭,列表如下。
運算子 |
說明 |
簡例 |
結果 |
---|---|---|---|
-band |
位元及閘運算,參與運算的兩邊位元都是 1,結果才是 1(只要一邊為 0,結果就是 0)。 |
10 -band 3 |
2 |
-bor |
位元或閘運算,參與運算的兩邊位元只要一邊是 1,結果就會是 1。 |
10 -bor 3 |
11 |
-bxor |
位元互斥閘運算,參與運算的兩邊位元只有一邊是 1,結果才會是 1。 |
10 -bxor 3 |
9 |
-bnot |
位元反閘,逆轉位元值。 |
-bnot 1 -band 1 |
0 |
位元運算是針對二進位的位元資料,雖然在 Windows PowerShell 可以如上述直接以十進位表示欲進行位元運算的資料,但改以二進位可能更有助於您理解運算過程:
10 -band 3 轉換成二進位→ 1010 -band 0011 = 0010 轉換成十進位→ 2 10 -bor 3 轉換成二進位→ 1010 -bor 0011 = 1011 轉換成十進位→ 11 10 -xbor 3 轉換成二進位→ 1010 -xbor 0011 = 1001 轉換成十進位→ 9 -bnot 1 -band 1 → 0 -band 1 = 0
Windows PowerShell 還包括了一些特別且實用的運算子,這些運算子所能完成的功能,在其他語言通常需要好幾個運算子共同完成。首先介紹的是替代運算子,它的功能就如同我們經常會用到的「搜尋後取代」,它的用法如下:
<"欲處理的字串"> -replace <"欲搜尋的字串">, <"欲替代的字串">
如同其他能比較字串的比較運算子,-replace 也另外有 c 開頭和 i 開頭的運算子:-replace 和 -ireplace 忽略大小寫,-creplace 不會忽略大小寫。以下是幾個關於 -replace 的例子。
# 將 PowerShell 裡的 e 換成 5 PS > "PowerShell" -replace "e", "5" Pow5rSh5ll # 將 PowerShell 裡的 a 換成 z,就算沒有任何替代(因為 PowerShell 沒有 a), # 也不會顯示錯誤訊息,依然顯示運算過的字串 PS > "PowerShell" -replace "a", "z" PowerShell # 再將替代後的結果指定給原變數 PS > $var = "PowerShell" PS > $var = $var -replace -replace "e", "5" # 亦可處理字串陣列 PS > $var = @("aaa","bbb","azaz","ccc") PS > $var = $var -replace "a", "z" PS > $var zzz bbb zzzz ccc
再次提醒,上述簡例都未處理字母大小寫,如果希望能處理大小寫,請使用 c 開頭的 -creplace。
Windows PowerShell 也提供了檢查資料型別的運算子,可以用來檢查是不是某種型別,以及能用來轉換型別;這些運算子列表如下。
運算子 |
說明 |
簡例 |
---|---|---|
-is |
是某種型別嗎?傳回 True 或 False。 |
$var -is [int] |
-isnot |
不是某種型別嗎?傳回 True 或 False。 |
$var -isnot [int] |
-as |
將物件轉成指定的型別 |
$var -as [string] |
要注意的是,使用這些運算子時,運算子右邊必須是欲檢查或指定的運算子,運算子左邊可以是變數或值,例如以下的例子:
# 檢查 123 是整數嗎?傳回 True 表示「是」。 PS > 123 -is [int] True # 檢查 123 不是字串嗎?傳回 True 表示「不是」。 PS > 123 -isnot [string] True # 將 123 轉成字串,並指定到 $var PS > $var = 123 -as [string] # 接著 $var 是字串嗎?傳回 True 表示「是」。 PS > $var -is [string] True
此外,如果想要知道變數到底是哪一種型別,可以透過變數的 GetType() 方法,這個方法回傳會一個物件,物件的 Name 屬性存放著型別名稱。例如承上 $var 變數的例子(必須注意的是,GetType() 的小括號不能省略):
PS > $var.GetType() IsPublic IsSerial Name BaseType ---------- ---------- -------- -------------- True True String System.Object 或 PS > $var.GetType().Name String
範圍運算子的符號是由兩個英文句點所構成(..)。之前的文章曾經使用過這個運算子,當時是將一段數值範圍指定給陣列,例如以下的例子:
PS > $var = @(1..5)
必須注意的是,範圍運算子只能用在整數,如果用在字串會產生錯誤,如果用在浮點數,則會產生出乎意料的結果,例如以下的例子:
# 不能用在字串,會產生錯誤 PS > $var = @("a" .. "i") # 結果並非 1.1 到 1.9 的浮點數,而是 1、2 兩個整數 PS > $var = @(1.1 .. 1.9) PS > $var 1 2
Windows PowerShell 提供了格式運算子(-f),這個運算子可以讓您將 .NET 提供的格式化機制用在 Windows PowerShell。.NET 格式化機制的細節本文暫且不表,細節可參考 MSDN 文件:(Formatting Overview)。
格式運算子的使用方式如下:
<格式< -f >欲格式化的字串>
也就是將欲格式化的字串,按照「格式」加以處理。以下以實例說明格式運算子所提供的功能。
# 日期時間的格式化 # 格式化之前,$var 的內容包含了完整的日期及時間,並請留意其格式 PS > $var = Get-Date PS > $var 2008 年 5 月 10 日 下午 03:39:01 # 格式化日期 PS > "{0:d}" -f $var 2008/5/10 # 格式化日期,請注意 D 是大小 PS > "{0:D}" -f $var 2008 年 5 月 10 日 # 格式化時間 PS > "{0:t}" -f $var 下午 03:39 # 格式化時間,請注意 T 是大小 PS > "{0:T}" -f $var 下午 03:39:01 # 數值的格式化 $val = 12345.6789 # 加上三位數逗號,且小數位數預設為兩位 PS > "{0:N}" -f $val 12,345.68 # 將小數位數指定成三位 PS > "{0:N3}" -f $val 12,345.679 # 與 \\"{0:N}\\" 相同,但不加三位數逗號 PS > "{0:F}" -f $val 12345.68 # 將小數位數指定成三位 PS > "{0:F3}" -f $var 12345.679
本文介紹了 Windows PowerShell 的邏輯運算子、位元運算子、替代運算子、型別運算子、範圍運算子、格式運算子,雖然有些運算子應用的機會較少,但仍是重要且實用的運算子。應用機會較多的可能就是邏輯運算子,尤其在需要以兩個條件式過濾資料的時候,就會用到。
此外,有些運算子雖然不在這兩篇文章的說明之列,但它們仍是 Windows PowerShell 相當重要的運算子,包括重導運算子(>、>>)、用來存取物件方法或屬性的「點」(.)等等;這些運算子已經在之前的文章介紹過了,因此這兩篇專述運算子的文章就不再重複。