Cmdlet 與管線
管線(pipeline)是 PowerShell 的核心:用 | 把前一個指令輸出的物件交給下一個指令處理。本頁說明為什麼「傳物件」比「傳文字」強大,並介紹每天都會用到的四個管線 cmdlet。
物件與管線
在 bash 裡,ps aux | grep chrome 傳遞的是一大串文字,你得自己切欄位。PowerShell 傳遞的是物件,每個物件有名稱明確的屬性,可以直接取用:
這行的意思是:取得所有處理程序 → 只留下 CPU 屬性大於 100 的 → 依 CPU 由大到小排序。整個過程沒有任何字串切割。
你不知道物件有哪些屬性時,用 Get-Member 查。
四個最常用的管線 cmdlet
| Cmdlet | 用途 | 別名 |
|---|---|---|
Where-Object |
篩選:只留下符合條件的物件 | where、? |
Select-Object |
選取:挑出某些屬性,或只取前 N 筆 | select |
Sort-Object |
排序 | sort |
ForEach-Object |
對每個物件做一件事 | foreach、% |
Where-Object:篩選
# 簡化語法:屬性 運算子 值
Get-Service | Where-Object Status -eq 'Running'
# 完整語法:用大括號寫任意條件,$_ 代表目前處理的那個物件
Get-Process | Where-Object { $_.WorkingSet -gt 200MB -and $_.Name -like 'c*' }
比較運算子是 -eq(等於)、-ne(不等於)、-gt(大於)、-lt(小於)、-like(萬用字元比對)、-match(正規表示式)。PowerShell 不用 ==、> 這些符號,因為 > 已經是「輸出到檔案」的意思。詳見 about_Comparison_Operators。
Select-Object:選取
# 只保留兩個屬性
Get-Process | Select-Object Name, Id
# 取記憶體用量最高的前 5 個
Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 5 Name, WorkingSet
# 計算屬性:自己組出一個新欄位(單位換成 MB)
Get-Process | Select-Object Name, @{ Name = 'MB'; Expression = { [math]::Round($_.WorkingSet / 1MB, 1) } }
ForEach-Object:逐一處理
# 對每個檔案顯示名稱與大小(KB)
Get-ChildItem *.log | ForEach-Object { "$($_.Name): $([math]::Round($_.Length / 1KB)) KB" }
ForEach-Object 適合放在管線中間;如果資料已經在變數裡,用 foreach 迴圈 通常更直覺。
管線怎麼把物件送給參數
管線傳過去的物件,會自動綁定到下一個 cmdlet 接受管線輸入的參數上。例如:
Stop-Service 的 -InputObject 參數接受管線輸入,所以不需要再指定名稱。想確認某個參數是否接受管線輸入,用 Get-Help Stop-Service -Full 看該參數的 Accept pipeline input? 欄位。
格式化只放在最後
Format-Table、Format-List 產生的是給螢幕看的格式化物件,不是原本的資料物件,所以只能放在管線的最後一步:
# 正確:先篩選、排序,最後才格式化
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 | Format-Table Name, CPU
# 錯誤:格式化後再篩選,後面的 cmdlet 拿到的已不是處理程序物件
Get-Process | Format-Table | Where-Object CPU -gt 100
如果你要把資料匯出、轉成 JSON 或交給其他 cmdlet,請不要 Format-*,直接輸出物件。
推薦影音
物件與管線深入講解
簡述:John Savill 的 PowerShell Master Class 第 2 單元,講解物件與 PowerShell 管線(約 67 分鐘),對應本頁全部內容,並示範如何把多個指令串在一起。錄於 2019 年,觀念在 PowerShell 7 仍適用。
相關資料
- about_Pipelines(官方說明)
- PowerShell 101:Discovering objects
- Getting Started with PowerShell 3.0:The pipeline(Snover 與 Helmick 的 Jump Start 影片)
- 下一步:變數與型別