约 2550 字

约 13 分钟

#管道与对象

#PowerShell 中的对象

PowerShell 与传统的 Shell 最大的区别在于:命令之间传递的是对象,而不是文本。

例如 Get-Process 返回的是进程对象,每个对象都包含多个属性:

> Get-Process -Name pwsh
 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     55    96.21     132.45       2.31   12345   1 pwsh

可以查看对象包含哪些成员:

> Get-Process -Name pwsh | Get-Member
   TypeName: System.Diagnostics.Process

Name        MemberType Definition
----        ---------- ----------
Id          Property   int Id {get;}
ProcessName Property   string ProcessName {get;}
...

#管道

管道运算符 | 将前一个命令的输出作为后一个命令的输入:

命令1 | 命令2 | 命令3

例如筛选名称包含 pwsh 的进程:

> Get-Process | Where-Object -Property ProcessName -Like "*pwsh*"

也可以写成更紧凑的形式:

> Get-Process | Where-Object ProcessName -Like "*pwsh*"

#当前管道对象

在 Where-Object、ForEach-Object 等命令的脚本块中,$_ 表示当前管道对象:

> Get-Process | Where-Object { $_.CPU -gt 10 }
> Get-Process | ForEach-Object { $_.ProcessName }
  • $_ 是 $PSItem 的简写。
  • 脚本块使用 { } 包裹。

#常用管道命令

命令说明
Where-Object按条件筛选对象
ForEach-Object对每个对象执行操作
Select-Object选择属性、前几项或后几项
Sort-Object按属性排序
Group-Object按属性分组
Measure-Object统计数量、平均值、最大值等
Format-Table以表格形式输出
Format-List以列表形式输出

例如:

> Get-Process | Sort-Object -Property CPU -Descending | Select-Object -First 5
> Get-Process | Measure-Object -Property CPU -Sum
> Get-ChildItem | Group-Object -Property Extension

#管道与文本的区别

在 Bash 中,管道传递的是文本,需要借助 awk、sed、grep 等工具解析字段。在 PowerShell 中,可以直接访问对象属性:

> Get-Process | Where-Object { $_.WorkingSet64 -gt 100MB } | Select-Object ProcessName, WorkingSet64
  • WorkingSet64 是进程对象的一个属性。
  • 100MB 是 PowerShell 支持的数值后缀。

#输出到文件

可以将管道结果保存为不同格式:

> Get-Process | Export-Csv -Path processes.csv -NoTypeInformation
> Get-Process | ConvertTo-Json | Set-Content processes.json
> Get-Process | Out-File -FilePath processes.txt

#推荐阅读

更新: 2026/11/2

作者: planc

创建: 2026/11/2