Where-Object 是什么
Where-Object 是 PowerShell 里按条件筛选管道对象的命令,相当于在数据流中间装一道筛子:条件为真的对象继续往下走,为假的被丢掉。它有两种写法——简写形式直接写「属性 运算符 值」,适合简单比较;脚本块形式写成花括号里的表达式,用 $_ 指代当前对象,能做算术、函数调用与多条件组合。写脚本时它是出现频率最高的环节之一,掌握它等于掌握了把「一堆对象」变成「需要的对象」的能力。
基本信息
| 适用平台 | Windows PowerShell 5.1 与 PowerShell 7 及以上 |
|---|---|
| 语法 | Where-Object <属性> <运算符> <值> 或 Where-Object { <条件表达式> } |
| 别名 | where、问号(会话内可用,脚本里建议写全名) |
| 常用运算符 | -eq 等于、-ne 不等于、-gt/-ge 大于、-lt/-le 小于、-like 通配、-match 正则、-in 属于集合 |
| 多条件 | 用 -and 与 -or 连接;需要括号明确优先级 |
| 组合用法 | 常与 Select-Object、Sort-Object、ForEach-Object 串成一条处理链 |
典型使用场景
- 筛出运行状态不符合预期的服务或进程,作为后续处理的目标
- 按资源占用阈值过滤进程,比如内存超过 500MB 的实例
- 从目录清单里挑出符合命名规则的文件,如备份文件、日志分卷
- 在批量导出前收窄数据范围,减少写入报表的行数
- 配合 -not 反向筛选,排除已知的正常项以突出异常项
- 从事件日志对象中挑出特定级别或来源的记录
常用示例
常用示例
# 简写形式:属性 运算符 值
Get-Service | Where-Object Status -eq Running
# 脚本块形式:可以写算术与表达式
Get-Process | Where-Object { $_.WorkingSet64 -gt 500MB }
# 通配符匹配文件名
Get-ChildItem C:\Backup | Where-Object Name -like *.bak
# 多条件组合
Get-Service | Where-Object { $_.StartType -eq 'Automatic' -and $_.Status -ne 'Running' }
# 反向筛选:排除机器账户
Get-WinEvent -LogName Security -MaxEvents 200 | Where-Object { $_.Properties[5].Value -notlike '*$' }两种写法对照
| 写法 | 语法示例 | 适用范围 |
|---|---|---|
| 简写 | Where-Object Status -eq Running | 单属性与常量比较,书写最短 |
| 简写取反 | Where-Object Status -ne Stopped | 判断「不等于某个值」 |
| 脚本块 | Where-Object { $_.Length -gt 100MB } | 需要算术运算或单位换算 |
| 脚本块多条件 | Where-Object { $_.A -eq 1 -and $_.B -like 'x*' } | 两个以上条件组合 |
| 脚本块调用 | Where-Object { $_.Name -in $list } | 引用外部变量或集合做匹配 |
简写形式只支持「属性 运算符 值」这一种结构,一旦出现加减乘除、函数调用或对多个属性做比较,就必须改用脚本块,否则表达式会被当成字符串比较而得到意外结果。
把最严格、最能排除大量数据的条件放在前面,能显著减少后续环节的处理量;在数万条记录上做多层过滤时,这一步的顺序差异很明显。
运算符选择对照
| 需求 | 运算符 | 说明 |
|---|---|---|
| 完全相等 | -eq | 数值按数值比,字符串默认不区分大小写 |
| 不相等 | -ne | 取反筛选,常用于排除正常项 |
| 大于与小于 | -gt、-ge、-lt、-le | 比较数值或时间对象 |
| 通配匹配 | -like、-notlike | 支持星号与问号,不涉及正则 |
| 正则匹配 | -match、-notmatch | 子串匹配,成功后可用内置变量取分组 |
| 属于集合 | -in、-contains | 判断值是否在列表里,注意左右方向 |
写过滤条件前的检查
- 先用 Get-Member 确认属性真实名称与类型,避免拿字符串当数字比
- 单独跑一次条件表达式,确认命中数量符合预期再放进管道
- 涉及时间比较时先把字符串转成日期类型,直接比文本会出错
- 条件里引用外部变量要确认作用域,脚本块中同样需要能访问到