最近在培訓PowerShell,在講到Pipeline的時候,對於我這種長期和數據(數據庫)打交道的人來講,以爲很實用,因此寫此博文,記錄一下。數據庫
不管是在Linux中寫Bash腳本仍是在Window上寫PowerShell,管道符」|「是一個很是有用的工具。它提供了將前一個命令的輸出做爲下一個命令的輸入的功能。在數據處理中,咱們也可使用管道符對數據進行各類操做。函數
先說導入導出是爲了可以爲接下來的數據處理準備數據。在PowerShell中咱們也能夠經過各類Get-XXX命令得到各類各樣須要的數據,可是並非全部操做系統和各個版本的PowerShell都支持某個命令的。好比Get-Volume命令,用於得到每一個磁盤的信息,可是這個命令不能在Win7下運行,只能在Win8或Win2012Server下運行。工具
最多見,最簡單的外部數據源就是CSV文件了。咱們可使用Export-Csv命令將PowerShell中的對象轉換爲CSV格式,持久化到磁盤上。好比咱們將當前的全部進程信息導出爲CSV文件,命令爲:spa
(注意,若是是有中文內容建議設置Encoding爲Unicode或者UTF8)操作系統
Import-Csv命令是導入外部的CSV文件到內存。比較剛纔導出的CSV文件,咱們接下來要對這個文件進行處理。咱們能夠將文件的內容保存到變量$data中。命令爲:code
固然,咱們也能夠先進行類型轉換,而後保存。命令爲:對象
前面咱們已經將CSV的內容載入到$data變量中了,那麼若是咱們要按照某一個字段排序,可使用Sort-Object命令。blog
好比咱們要Name這個字段排序,並輸出排序後的結果,那麼命令爲:排序
也能夠簡寫爲:進程
若是是須要多個字段排序,那麼能夠將字段列在後面,字段之間用逗號隔開。
若是是逆向排序,那麼須要在字段後面加參數-Descending
選取至關於SQL中的SELECT命令。對應的PowerShell命令是Select-Object,能夠簡寫爲Select。該命令後面跟上要選取的列名便可。若是是要選取全部的列,也可使用*表示。
選取全部列,那麼命令就是:
若是是隻選取前面幾條數據,那麼可使用-First參數。好比咱們按Handles排序,只查看頭10條進程記錄的名字和Handles。命令爲:
另外還有參數-Last選取的是最後幾條記錄,-Skip能夠選擇跳過必定記錄。
在SELECT的時候,咱們可使用函數對其中的列進行運算,使用的語法是:
其中的$_就是表示當前的記錄。
好比VM列記錄的是以Byte爲單位的數據,咱們先新建一列名爲」VM(MB)」,其值是換算成MB的結果,那麼咱們能夠寫爲:
說度量可能有點不是很清晰,其實就是對應SQL中的聚合函數。好比 SUM, Max,Min之類的,須要使用Measure-Object命令。好比要查看有多少個程序,最小的Handles和最大的Handles,那麼命令是:
既然說到SQL中的聚合函數,那麼天然就會想到另一個關鍵字Group By。在PowerShell中也有對應的命令Group-Object。若是咱們想要按進程的Name進行分組,查看每一個進程名對應的VM總大小。那麼咱們能夠先按Name進行Group:
這時咱們能夠看到系統返回的結果有3列:Count,Name,Group。而咱們要進行聚合的VM值是在Group中。這時須要用到前面提到的Select命令。
過濾至關於SLQ中的Where語句,在PowerShell中使用Where-Object命令。能夠簡寫爲Where,甚至能夠簡寫爲」?」。在普通程序裏面咱們遇到的比較運算和邏輯運算在PowerShell中有所不一樣,是這樣的參數:
Comparison |
Case-InSensitive |
Case-sensitive |
Equality |
-eq |
-ceq |
Inequality |
-ne |
-cne |
Greater than |
-gt |
-cgt |
Less than |
-lt |
-clt |
Greater than or equal to |
-ge |
-cge |
Less than or equal to |
-le |
-cle |
Wildcard equality |
-like |
-clike |
-and 和-or用於邏輯運算。
仍然之前面load的$data爲例,咱們要查看以W開頭的進程的Handles和Name,那麼命令爲:
若是是多個條件,既要以w開頭,還要VM大於100M的進程,那麼命令爲:
枚舉至關於C#中的Foreach函數,或者說是SQL中的遊標,對於每一行數據,都進行一個運算或者函數處理。在PowerShell中對應的命令是ForEach-Object,能夠簡寫爲ForEach,還能夠進一步簡寫爲」%「。
好比咱們要將VM改成MB爲單位,能夠對每一行數據進行運算:
運行該命令後咱們再查看$data就會發現VM列已經改變了。
另外對於Foreach命令,還有兩個比較有用的參數-Begin –End,用於在作For循環以前調用和循環結束後調用。
好比咱們想把某一列寫入一個文件,咱們能夠在-Begin時建立文件,記錄開始的時間,而後Foreach中Append內容到文件,最後把結束時間寫入: