PowerShell的一個重中之重的功能就是管道(pipeline),本文從淺入深,一步一步詳解管道的使用方法和例子,來看看有沒有你所不知道的吧,若是全知道,恭喜你已經很厲害啦——適用於全部PowerShell應用小白與技術老鳥。另外歡迎各位技術大牛來補充討論學習~html
在Shell中一個重要的基本概念就是管道(pipeline),即在一組命令中,輸出的命令結果成爲下一個命令的輸入參數。管道的概念與真實生活中的生產線比較類似:在不一樣的生產環節進行連續的再加工,以下圖例子:shell
「Get-ChildItem」意思是獲取當前路徑的全部項目,「|Where-Object {$_.Length -gt 200}」意思是查看上一步結果,取全部長度大於200的項目,「|Sort-Object -Descending Name」意思是查看上一步結果,按照Name進行倒敘排列。數組
在PowerShell中,使用管道符號(|)來劃分管道中的每一個命令,上述例子說明了管道的強大功能,同時PowerShell在管道中傳遞的是高保真對象,不只僅是文本描述。瀏覽器
下面主要給你們介紹一下經常使用的管道處理命令。ide
可使用Where-Object(別名是where和?)從列表或者命令輸出結果中過濾選擇你須要的項目。學習
對於輸入的每一項,Where-Object都會根據{}中定義的腳本塊對輸入進行計算,若是返回True,則輸出,不然不輸出。以下例子:spa
{}表示一個腳本塊,能夠輸入一系列PowerShell命令,其中$_表明當前輸入對象,在這個例子中,$_就表明一個文件項目。-gt是比較操做符,意思是大於,關於比較操做符的介紹以下:3d
PowerShell中比較操做符是用於對錶達式進行比較的。默認狀況比較操做符不區分大小寫,若是想要區分,須要使用-C前綴,不須要區分的,使用-I前綴。orm
全部可用的比較操做符以下表格:htm
操做符 |
意義 |
返回True的例子 |
-eq |
相等符 |
10 -eq 10 |
-ne |
不相等符 |
10 -ne 9 |
-ge |
大於等於操做符 |
10 -ge 9 |
-gt |
大於操做符 |
10 -gt 9 |
-lt |
小於操做符 |
10 -lt 11 |
-le |
小於等於操做符 |
10 -le 11 |
-like |
類似操做符 |
"Bob" -like "*ob" |
-notlike |
非類似操做符 |
"Bob" -notlike "1*ob" |
-match |
匹配操做符 |
"Bob" -match "B*ob" |
-notmatch |
非匹配操做符 |
"Bob" -notmatch "123*" |
-contains |
包含操做符 |
"Bob","Bob1" -contains "Bob" |
-notcontains |
非包含操做符 |
"Bob","Bob1" -notcontains "ob" |
-is |
類型操做符 |
"Bob" -is "System.String" |
-isnot |
非類型操做符 |
"Bob" -isnot "System.Int32" |
使用ForEach-Object命令(別名是foreach和%)來處理列表中的每一項。
使用例子以下:
例子中1..10的意思是簡單聲明瞭一個1~10的一組數字。其中處理列表中每一項還能夠用for、foreach、do和while等,之後會更詳細的介紹。
使用Select-Object(別名是select)對象能夠選擇一個對象或者一組對象的指定屬性。還能夠從對象的數組中選擇惟一的對象,也能夠從對象數組的開頭或末尾選擇指定個數的對象。
若是使用 Select-Object 來選擇指定屬性,則它會從輸入對象中複製這些屬性的值,並建立具備指定的屬性和複製的值的新對象。使用 Property 參數指定您要選擇的屬性。或者,使用 First、Last、Unique、Skip 和 Index 參數從輸入對象數組中選擇特定對象。
使用例子以下:
a) 選擇當前路徑下全部項目的Name和Length屬性:
b) 選擇當前路徑下前三個項目:
c) 選擇當前路徑下全部項目的Name和自定義屬性,名字叫作Last Modified Day,結果是經過LastWriteTime屬性算出來的:
d) 選擇當前路徑下第一個和第六個項目:
e) 選擇當前路徑下除第五個項目外的全部項目:
f) 顯示數組中的惟一數字:
使用Sort-Object(別名是sort)能夠按照特定屬性值對對象進行排序。您能夠指定一個屬性或多個屬性(用於多鍵排序),也能夠選擇區分大小寫或不區分大小寫的排序。您還能夠指示 Sort-Object 只顯示對於特定屬性具備惟一值的對象。
若是某個對象不具備所指定的屬性之一,則 cmdlet 會將該對象的屬性值解釋爲 NULL,並將其放置在排序順序的末尾。
使用例子以下:
a) 對當前路徑下全部的項目按照長度從小到大排序:
b) 對整個數組的惟一性數字按照降序排列:
使用Tee-Object(別名是tee)命令能夠將命令輸出結果保存在文件或者變量中,同時將其顯示在控制檯中。
a) 將當前路徑下全部大小大於900的項目都保存到文件中並顯示在控制檯中:
b) 將當前路徑下全部大小大於900的項目都保存在變量中並顯示在控制檯中:
使用Group-Object(group)對列表項或者輸出結果進行分組,指定的屬性包含相同值的組對象。Group-Object 返回一個表,其中每一個屬性值對應一行,同時一個列顯示具備該值的項目數。
還可讓返回的對象是個HashTable——key-value的鍵值對數組,指定-AsHashTable參數:
使用Measure-Object(measure)計算對象的數字屬性以及字符串對象(如文本文件)中的字符數、單詞數和行數。它計算某些類型對象的屬性值。Measure-Object 執行三種類型測量,具體取決於命令中的參數。能夠對對象計數並計算數字值的最小值、最大值、總和及平均值。對於文本對象,它能夠計數並計算行數、單詞數和字符數。
a) 計算當前路徑下項目的總數:
b) 計算當前路徑下項目的長度的最小值、最大值以及平均值:
c) 計算當前文件中字符、行、單詞的總數:
用Compare-Object(別名是compare和diff)能夠將兩組對象進行比較,一組對象爲Reference組,而另外一組爲Difference組。比較的結果將指示屬性值是隻出如今 Reference 組中的對象中(由 <= 符號指示),或是隻出如今 Difference 組中的對象中(由 => 符號指示),抑或(在指定了 IncludeEqual 參數的狀況下)同時出如今這兩個對象中(由 == 符號指示)。
用ConvertTo-Html能夠將Microsoft.Net Framework對象轉換爲可在Web瀏覽器中顯示的HTML:
用Export-Csv(別名是epcsv)將 Microsoft .NET Framework 對象轉換爲一系列以逗號分隔的、長度可變的 (CSV) 字符串,並將這些字符串保存到一個 CSV 文件中。
Format-List(別名是fl)能夠將輸出的格式設置爲屬性列表,其中每一個屬性均各佔一行顯示:
Format-Table(別名是ft)能夠將輸出的格式設置爲表:
Format-Wide(別名是fw)能夠將對象的格式設置爲只能顯示每一個對象的一個屬性的寬表:
使用Get-Unique(別名是gu)能夠從排序列表中返回惟一項目。
可使用Out-File將輸出發送到文件:
管道操做的時候常常會用到管道輸入對象的屬性,使用Get-Member(gm)來獲取對象的屬性和方法。
a) 獲取對象的公有屬性:
b) 獲取對象的公有方法:
當得知對象的公有屬性和方法的名字後,就能夠在管道操做中使用了。
學會使用管道後,得學會判斷一個命令是否支持管道輸入。使用Get-Help命令獲取一個命令的使用方法,對於參數,能夠看到是否支持管道輸入,或者經過MSDN去查詢命令幫助。
好比PowerShell Core裏面的Where-Object的MSDN的幫助站點是:https://msdn.microsoft.com/powershell/reference/5.1/microsoft.powershell.core/Where-Object。
對於裏面的-InputObject則是支持管道輸入,-Is則不支持管道輸入:
好比PowerShell Core裏面的Move-Item的MSDN的幫助站點是:https://msdn.microsoft.com/powershell/reference/5.1/microsoft.powershell.management/Move-Item。
對於裏面的-Path則是支持管道輸入,-UseTransaction則不支持管道輸入:
對於沒有任何一個參數支持管道輸入的命令則是不支持管道輸入的命令。
若是要對大量的數據進行處理簡單的任務,能夠把數據保存在一個CSV文件裏面,使用Import-Csv來導入數據,導入後爲每一行自動建立對象,並將列的名字做爲對象的屬性,以後用foreach對數據的每一項進行操做。
若是你命名的CSV文件中的列的名字和管道使用的參數名一致,PowerShell能夠實現這種部分或所有參數的映射。
PowerShell的一個主要的優勢就是具備自動化重複性任務的能力。有時候,這些重複性的任務是動做密集的(如系統維護,操做註冊表,或者文件清理),而且包括複雜的有順序的互相調用的命令。在這種狀況下,能夠經過編寫腳本將這些操做組合到一塊兒,這樣能夠節省時間,下降錯誤的發生。
上述列舉的只是經常使用的命令和使用方法,PowerShell強大的命令集徹底不止這些。
[原創文章,轉載請註明出處,僅供學習研究之用,若有錯誤請留言,如以爲不錯請推薦,謝謝支持]
[原文:http://www.cnblogs.com/lavender000/p/6941393.html,來自永遠薰薰]