Skip to content

建立 2026-09-19 更新 2026-09-19

Cmdlet 與管線

管線(pipeline)是 PowerShell 的核心:用 | 把前一個指令輸出的物件交給下一個指令處理。本頁說明為什麼「傳物件」比「傳文字」強大,並介紹每天都會用到的四個管線 cmdlet。

物件與管線

在 bash 裡,ps aux | grep chrome 傳遞的是一大串文字,你得自己切欄位。PowerShell 傳遞的是物件,每個物件有名稱明確的屬性,可以直接取用:

Get-Process | Where-Object CPU -gt 100 | Sort-Object CPU -Descending

這行的意思是:取得所有處理程序 → 只留下 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 接受管線輸入的參數上。例如:

Get-Service -Name 'Spooler' | Stop-Service

Stop-Service-InputObject 參數接受管線輸入,所以不需要再指定名稱。想確認某個參數是否接受管線輸入,用 Get-Help Stop-Service -Full 看該參數的 Accept pipeline input? 欄位。

格式化只放在最後

Format-TableFormat-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 仍適用。

相關資料