PowerShell如何匹配对象子属性 实现列表嵌套属性过滤
嵌套子属性过滤失效的原因
Where-Object的「属性名 比较运算符 值」简化语法仅支持匹配对象的顶层直接属性,不会自动解析点分隔的嵌套属性路径。你直接写name.firstName这类路径时,PowerShell会把整串字符当成一个顶层属性名查找,自然返回不了正确结果。
另外你贴的WSUS排查代码里还有两个笔误,也会导致执行失败:
- 定义的集合变量是
$updates,后续过滤时误写为$update - cmdlet名写错,是
Where-Object(中间是连字符)不是Where_Object(中间是下划线)
正确过滤写法
使用Where-Object的脚本块过滤模式,把判断逻辑包裹在{}中,用$_指代当前遍历的列表项,直接写完整的嵌套属性访问路径即可,这个写法全版本PowerShell通用。
普通嵌套属性场景示例
# 查找name.firstName等于Bob的对象 $listOfObjects | Where-Object { $_.name.firstName -eq "Bob" }
WSUS更新查找场景示例
$updates = Get-WsusUpdate # 查找标题包含"Windows"的更新 $updates | Where-Object { $_.Update.Title -match "Windows" }
鲁棒性优化写法
如果列表里可能存在缺失中间层属性的对象,建议在判断嵌套属性前先校验中间层是否为空,避免抛出空引用错误:
$listOfObjects | Where-Object { $_.name -ne $null -and $_.name.firstName -eq "Bob" }
内容的提问来源于stack exchange,提问作者Bagheera
相关产品推荐
相关产品推荐

