命令是干什么的
Where-Object 是 PowerShell 的过滤核心,但它的比较语义与多数语言不同:比较运算符作用在集合上返回的是匹配元素而不是布尔值,-like 用通配符、-match 用正则、-in 判断值是否在集合中,混用会导致“看起来对”却筛错的结果。
写法上的演进
传统写法是 Where-Object { $_.Status -eq 'Running' },PowerShell 3.0 起支持简化语法 Where-Object Status -eq 'Running',省掉 $_ 后更易读。简化语法在比较对象本身是集合时会逐元素比较,语义更贴近直觉,也是排查“过滤条件不生效”时值得切换的写法。
基本信息
| 适用平台 | PowerShell 3.0 及以后支持简化语法 |
|---|---|
| 语法 | Get-X | Where-Object { $_.属性 -eq 值 };简化写法 Where-Object 属性 -eq 值 |
| 比较运算符 | -eq、-ne、-gt、-lt、-like、-match、-in、-notin、-contains |
| 大小写 | 默认不区分,加 c 前缀(-ceq、-clike)才区分 |
典型使用场景
- 按状态或名称筛选服务与进程,缩小后续处理范围
- 用 -in 一次匹配多个取值,替代一长串 -or 条件
- 用 -like 做通配匹配(如 *.log),用 -match 做正则匹配
- 判断元素是否属于某集合,注意 -contains 与 -in 的方向相反
- 在管道里组合多条件,先粗筛再精筛以提升可读性
常用示例
常用示例
1,2,3 -eq 2 # 返回 2,不是 True
Get-Service | Where-Object Status -eq 'Running' # 简化语法
Get-Service | Where-Object Name -in 'Spooler','wuauserv' # 值在右侧集合中
Get-ChildItem | Where-Object Extension -in '.log','.txt'
Get-ChildItem | Where-Object Name -like '*.bak' # 通配符匹配
'abc' -match '^a' # 正则匹配,命中可用 $matches运算符读法
| 运算符 | 语义 | 注意 |
|---|---|---|
| -eq | 是否相等 | 作用在集合上返回匹配元素集合 |
| -like | 通配符匹配 | 支持 * 与 ? 两个通配符 |
| -match | 正则匹配 | 命中后可用 $matches 取分组 |
| -in | 值是否在右侧集合中 | 方向与 -contains 相反 |
| -contains | 集合是否包含左侧值 | 两侧元素类型要一致 |
| -notin | 不在集合中 | 常用于排除清单 |
对集合使用 -eq 返回的是匹配元素集合,可以继续在管道里使用,但不能当作布尔条件直接判断真假。
判断空值要用 $null -eq $x 的写法,把变量放在右侧,数组场景下才不会被展开成逐元素比较而得到意外结果。
筛选结果异常时把简化写法改回 { $_.属性 -eq 值 } 再跑一次,往往能立刻看清问题出在属性还是比较语义上。