發佈日期: 2008 年 5 月 13 日
作者:賴榮樞
www.goodman-lai.idv.tw
本文將繼續介紹 Windows PowerShell 所提供的運算子,這些實用的運算子將資料的處理有很大的幫助。
本頁內容
邏輯運算子
位元運算子
替代運算子
型別運算子
範圍運算子
格式運算子
結語
補述其他的運算子之前先提醒您,包括上一篇文章介紹的比較運算,以及本文即將說明的邏輯運算、型別運算,其結果都是 True 或 False 的布林值,因此在需要條件判斷的地方,經常會使用這類的運算;例如資料過濾的條件式,或者是迴圈、流程控制等。
邏輯運算子
如果要評估兩個以上的條件式,就是使用邏輯運算子的時機。例如:
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)
(3 -eq 3) -xor (2 -eq 5)
|
False
True
|
|
-not(!)
|
反閘,逆轉運算結果。
|
(3 -eq 3) -and !(2 -eq 5)
或
(3 -eq 3) -and -not(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 相當重要的運算子,包括重導運算子(>、>>)、用來存取物件方法或屬性的「點」(.)等等;這些運算子已經在之前的文章介紹過了,因此這兩篇專述運算子的文章就不再重複。