where-object 用于管道中过滤对象,不修改对象仅决定是否传递;需先了解对象属性结构,再用基础语法(如 where status -eq running)或脚本块语法(如 { $_.status -eq 'running' })编写条件;运算符均以短横线开头(如 -eq、-like),区分大小写加 c 前缀;应尽早过滤并优先使用 cmdlet 原生筛选参数提升性能。
powershell 中用 where-object 过滤管道对象,核心是“对每个传入对象做判断,只留下满足条件的”。它不修改对象本身,只决定是否让对象继续往下走。关键在于写对条件表达式,而且要清楚对象有哪些属性可用。
知道对象长什么样,再写条件
盲目写条件容易没结果——比如拼错属性名,PowerShell 不报错,只是静默返回空。先确认目标对象的结构:
- 用
Get-Process | Select-Object -First 1 | Format-List *查看一个进程的所有属性(如Name、Id、CPU、WorkingSet) - 或用
Get-Service | Get-Member -MemberType Property列出服务对象所有可读属性(如Status、StartType、DisplayName)
两种常用写法:基础语法和脚本块语法
基础语法适合单属性简单比较,写起来快;脚本块语法灵活,支持多条件、复杂逻辑和属性嵌套访问。
-
基础语法:例如
Get-Service | Where Status -eq Running——等价于Where-Object -Property Status -EQ Running -
脚本块语法:必须用大括号
{},用$_代表当前对象,例如Get-Service | Where-Object { $_.Status -eq 'Running' -and $_.StartType -eq 'Automatic' } - 注意:基础语法不支持
-and、-or或点号访问(如$_.Name.Length),这类必须用脚本块
常用比较运算符别记混
PowerShell 不用 == 或 !=,所有比较都以短横线开头,且默认不区分大小写:
-
-eq(等于)、-ne(不等于)、-gt/-lt(大于/小于) -
-like支持通配符:"winlogon" -like "win*"→True -
-contains用于检查数组是否含某值:@("a","b","c") -contains "b" - 需要区分大小写时,加
C前缀,如-ceq、-clike
性能优化:越早过滤越好
Where-Object 是“拦路关卡”,越靠近管道开头,后续命令处理的数据就越少。尤其避免在排序、导出前才过滤:
- ❌ 慢:
Get-Process | Sort-Object CPU -Descending | Where-Object { $_.CPU -gt 100 }(先排几百个进程,再筛) - ✅ 快:
Get-Process | Where-Object { $_.CPU -gt 100 } | Sort-Object CPU -Descending(先筛出几个高 CPU 进程,再排) - 更优:有些 cmdlet 自带筛选参数,优先用它。例如
Get-ChildItem -File比Get-ChildItem | Where-Object { -not $_.PSIsContainer }更高效











