PowerShell如何筛选Attr1含指定UPN列表值的嵌套对象
PowerShell嵌套对象筛选的正确实现
你原有筛选逻辑失效的核心原因是,当$_.Attr1为空数组、或包含null值时,直接调用$_.Attr1.UPN -in $UPN的返回值可能不是预期的布尔值,导致筛选器判断错误丢失数据。以下是两种适配不同场景的正确写法:
方案1:简洁写法(适合小规模数据)
直接在筛选脚本块中显式校验匹配结果的存在性,利用布尔隐式转换返回判断结果:
$CollectionOfObjects | Where-Object { # 只要Attr1中存在任意一个UPN在目标列表中就保留当前对象 [bool]($_.Attr1.UPN -in $UPN) }
如果需要兼容更低版本的PowerShell,也可以写成:
$CollectionOfObjects | Where-Object { ($_.Attr1 | ForEach-Object { $_.UPN }) -in $UPN }
方案2:高性能写法(适合大规模数据)
当UPN列表或待筛选对象集合规模较大时,优先用哈希集合做O(1)级别的查找,大幅提升筛选效率:
# 初始化不区分大小写的哈希集合存储目标UPN $upnLookup = [System.Collections.Generic.HashSet[string]]::new($UPN, [StringComparer]::OrdinalIgnoreCase) $CollectionOfObjects | Where-Object { foreach ($attrItem in $_.Attr1) { if ($upnLookup.Contains($attrItem.UPN)) { # 匹配到就直接返回true,不需要遍历剩余项 return $true } } return $false }
效果验证
针对你提供的示例数据,两种写法都会正确筛选出Id = 1的对象,符合「Attr1包含目标UPN列表中任意地址」的筛选要求。
内容的提问来源于stack exchange,提问作者anders1990
相关产品推荐
相关产品推荐

