本文將繼續介紹 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 轉換成十進位→ 210 -bor 3 轉換成二進位→ 1010 -bor 0011 = 1011 轉換成十進位→ 1110 -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 換成 5PS > "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 > $varzzzbbbzzzzccc
再次提醒,上述簡例都未處理字母大小寫,如果希望能處理大小寫,請使用 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 轉成字串,並指定到 $varPS > $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().NameString
範圍運算子的符號是由兩個英文句點所構成(..)。之前的文章曾經使用過這個運算子,當時是將一段數值範圍指定給陣列,例如以下的例子:
PS > $var = @(1..5)
必須注意的是,範圍運算子只能用在整數,如果用在字串會產生錯誤,如果用在浮點數,則會產生出乎意料的結果,例如以下的例子:
# 不能用在字串,會產生錯誤PS > $var = @("a" .. "i") # 結果並非 1.1 到 1.9 的浮點數,而是 1、2 兩個整數PS > $var = @(1.1 .. 1.9)PS > $var12
Windows PowerShell 提供了格式運算子(-f),這個運算子可以讓您將 .NET 提供的格式化機制用在 Windows PowerShell。.NET 格式化機制的細節本文暫且不表,細節可參考 MSDN 文件:(Formatting Overview)。
格式運算子的使用方式如下:
<格式< -f >欲格式化的字串>
也就是將欲格式化的字串,按照「格式」加以處理。以下以實例說明格式運算子所提供的功能。
# 日期時間的格式化# 格式化之前,$var 的內容包含了完整的日期及時間,並請留意其格式PS > $var = Get-DatePS > $var2008 年 5 月 10 日 下午 03:39:01 # 格式化日期PS > "{0:d}" -f $var2008/5/10 # 格式化日期,請注意 D 是大小PS > "{0:D}" -f $var2008 年 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 $val12,345.68 # 將小數位數指定成三位PS > "{0:N3}" -f $val12,345.679 # 與 "{0:N}" 相同,但不加三位數逗號PS > "{0:F}" -f $val12345.68 # 將小數位數指定成三位PS > "{0:F3}" -f $var12345.679
本文介紹了 Windows PowerShell 的邏輯運算子、位元運算子、替代運算子、型別運算子、範圍運算子、格式運算子,雖然有些運算子應用的機會較少,但仍是重要且實用的運算子。應用機會較多的可能就是邏輯運算子,尤其在需要以兩個條件式過濾資料的時候,就會用到。
此外,有些運算子雖然不在這兩篇文章的說明之列,但它們仍是 Windows PowerShell 相當重要的運算子,包括重導運算子(>、>>)、用來存取物件方法或屬性的「點」(.)等等;這些運算子已經在之前的文章介紹過了,因此這兩篇專述運算子的文章就不再重複。
自由广告区 |
分类导航 |
邮件新闻资讯: IT业界 | 邮件服务器 | 邮件趣闻 | 移动电邮 电子邮箱 | 反垃圾邮件|邮件客户端|网络安全 行业数据 | 邮件人物 | 网站公告 | 行业法规 网络技术: 邮件原理 | 网络协议 | 网络管理 | 传输介质 线路接入 | 路由接口 | 邮件存储 | 华为3Com CISCO技术 | 网络与服务器硬件 操作系统: Windows 9X | Linux&Uinx | Windows NT Windows Vista | FreeBSD | 其它操作系统 邮件服务器: 程序与开发 | Exchange | Qmail | Postfix Sendmail | MDaemon | Domino | Foxmail KerioMail | JavaMail | Winwebmail |James Merak&VisNetic | CMailServer | WinMail 金笛邮件系统 | 其它 | 反垃圾邮件: 综述| 客户端反垃圾邮件|服务器端反垃圾邮件 邮件客户端软件: Outlook | Foxmail | DreamMail| KooMail The bat | 雷鸟 | Eudora |Becky! |Pegasus IncrediMail |其它 电子邮箱: 个人邮箱 | 企业邮箱 |Gmail 移动电子邮件:服务器 | 客户端 | 技术前沿 邮件网络安全: 软件漏洞 | 安全知识 | 病毒公告 |防火墙 攻防技术 | 病毒查杀| ISA | 数字签名 邮件营销: Email营销 | 网络营销 | 营销技巧 |营销案例 邮件人才:招聘 | 职场 | 培训 | 指南 | 职场 解决方案: 邮件系统|反垃圾邮件 |安全 |移动电邮 |招标 产品评测: 邮件系统 |反垃圾邮件 |邮箱 |安全 |客户端 |