如何过滤掉包含指定数组标签的PowerShell自定义对象?
PowerShell过滤不含指定标签的对象
问题原因
你当前的代码$_.Tags -notin $Filter逻辑错误:-notin运算符是用来检查单个值是否不在目标集合中,但$_.Tags是一个数组(比如{11,15}),此时PowerShell会把整个数组当作一个整体去和$Filter里的单个元素对比,显然永远不匹配,所以所有对象都被保留了。
你需要的是:过滤掉Tags数组与$Filter有任何交集的对象,只保留完全没有重叠标签的对象。
解决方法
方法1:嵌套遍历检查(直观易懂)
通过遍历每个对象的Tags元素,判断是否存在属于Filter的标签,取反后即可得到符合要求的对象:
$Filter = ('11','14','15') $Filtered_Objects = $Objects | Where-Object { -not ($_.Tags | Where-Object { $_ -in $Filter }) }
方法2:用Compare-Object检查交集
利用Compare-Object判断两个集合是否存在重叠元素,当没有交集时返回$null,结合-not完成过滤:
$Filter = ('11','14','15') $Filtered_Objects = $Objects | Where-Object { -not (Compare-Object $_.Tags $Filter -IncludeEqual -ExcludeDifferent) }
方法3:LINQ高效处理(适合大量对象)
如果需要处理的对象数量较多,使用LINQ的Any方法性能更优:
$Filter = [string[]]('11','14','15') # 统一类型避免隐式转换 $Filtered_Objects = $Objects | Where-Object { -not [System.Linq.Enumerable]::Any($_.Tags, [Func[object,bool]]{ $args[0] -in $Filter }) }
验证结果
执行上述任意方法后,$Filtered_Objects只会保留:
Title : Example Three Year : 2022 Id : 12347 Tags : {12, 13}
内容的提问来源于stack exchange,提问作者CarlDog
相关产品推荐
相关产品推荐

