#管道与对象
#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;}
...
Get-Member用于查看对象的属性和方法。- 更多用法详见 Get-Member 帮助手册。
#管道
管道运算符 | 将前一个命令的输出作为后一个命令的输入:
命令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