PowerShell管道传递的是结构化对象而非文本。例如Get-Process返回System.Diagnostics.Process对象,含Name、ID等属性和Kill()等方法;后续命令通过ByValue或ByPropertyName机制自动绑定参数,支持直接属性筛选、导出、对比及-WhatIf安全预演。
powershell 的管道不是“把左边的输出文字塞给右边”,而是把结构化的对象一个一个传过去。理解这一点,才能真正用好它。
管道传的是对象,不是屏幕上的表格
当你运行 Get-Process,屏幕上看到的是几列文字,但 PowerShell 实际返回的是一个个 System.Diagnostics.Process 对象。每个对象自带属性(如 Name、ID、CPU、WorkingSet)和方法(如 Kill())。后续命令直接操作这些属性和方法,不需要解析文本。
- 用 Get-Member 查看对象结构:
Get-Process | Get-Member -MemberType Property - 用 Select-Object 提取属性:
Get-Process | Select-Object Name, ID, CPU - 用 Where-Object 按属性筛选:
Get-Process | Where-Object {$_.CPU -gt 100}
对象怎么自动“找到”下一个命令的参数?
PowerShell 通过两种机制完成绑定:ByValue 和 ByPropertyName。
-
ByValue:上游对象类型与下游参数类型一致,就自动绑定。例如
Get-Service | Stop-Service成立,因为Get-Service输出ServiceController对象,而Stop-Service的-InputObject参数明确支持该类型 -
ByPropertyName:上游对象有某个属性,名字和类型都匹配下游某参数名,也会绑定。例如
[PSCustomObject]@{Name='notepad'} | Start-Process能运行,因为Name属性被自动绑定到Start-Process -Name参数 - 查绑定方式:用
Get-Help Stop-Service -Parameter InputObject或看帮助中的 Accept pipeline input? 字段
导出和对比都基于对象,不是文本
导出命令(如 Export-Csv)接收的是对象流,直接按属性生成列;对比命令(如 Compare-Object)比的是属性值是否相同,而不是两段字符串是否一样。
- 导出进程列表为 CSV:
Get-Process | Select-Object Name, Id, CPU | Export-Csv -Path .\procs.csv -NoTypeInformation - 对比两次采集的服务状态:
$before = Get-Service; $after = Get-Service; Compare-Object $before $after -Property Name, Status - 生成 HTML 报告:
Get-Service | Where-Object {$_.Status -ne 'Running'} | ConvertTo-Html | Out-File .\down-services.html
安全执行靠对象特性,不靠猜格式
因为传的是对象,高危操作可以提前预演,避免误删误停。
- 用
-WhatIf预览效果:Get-Service wuauserv | Stop-Service -WhatIf - 用
-Confirm强制确认:Get-Process chrome | Stop-Process -Confirm - 对象自带上下文,不会因输出格式变化而失效——不像文本管道依赖
awk '{print $2}'这类脆弱解析


















