首页/系统/Windows 运维速查/Where-Object 按条件过滤
PowerShell 基础66 条

Where-Object 按条件过滤

按属性条件筛选管道对象:支持简写比较语法与脚本块两种写法,是数据处理最常用的环节之一。

Windows 运维速查系统更新于 2026-10-13

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 确认属性真实名称与类型,避免拿字符串当数字比
  • 单独跑一次条件表达式,确认命中数量符合预期再放进管道
  • 涉及时间比较时先把字符串转成日期类型,直接比文本会出错
  • 条件里引用外部变量要确认作用域,脚本块中同样需要能访问到

易错点

  • 在简写形式里写表达式:Where-Object { } 之外的简写只支持属性与值比较,写算术或函数调用不会报错但结果错误
  • 忘记在脚本块里写 $_:表达式变成常量判断,要么全部命中要么全部被丢弃,排查时先单独跑一次条件验证
  • 用 -match 却当成精确匹配:它是子串正则匹配,需要整体相等应改用 -eq,需要通配用 -like
  • 在字符串比较中忽略大小写差异:-eq 默认不区分大小写,需要区分时应使用 -ceq 系列运算符
  • 对集合属性直接比较:属性本身是数组时需要 -contains 或 -in,用 -eq 往往得不到期望结果

数据来源与参考

  • Microsoft Learn:Where-Object

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌