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)
(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 相當重要的運算子,包括重導運算子(>、>>)、用來存取物件方法或屬性的「點」(.)等等;這些運算子已經在之前的文章介紹過了,因此這兩篇專述運算子的文章就不再重複。

顯示: