PowerShell中Where-Object多条件从左到右匹配无法返回预期结果如何解决?
问题解决说明
问题根源
当前代码逻辑与需求完全相反:
你需要的规则是 同时满足三个条件时才排除对应对象,而Where-Object默认会保留脚本块返回值为$true的对象,你原来的写法要求三个条件同时满足才保留对象,而测试数据中不存在同时满足三个条件的对象,因此无返回结果。
三个条件同时满足才排除的逻辑,转换成保留规则是:保留「不满足(三个条件同时成立)」的对象。
正确实现(单Where-Object语句即可,无需更换哈希表逻辑)
你可以直接用-not包裹整个排除条件,或者用德摩根定律展开为或逻辑,两种写法都可以:
写法1:直译需求(可读性更高)
$Test | Where-Object { -not ($_.Name -notmatch $NameRegex -and $_.DisplayName -ne 'DisplayName1' -and $_.AccessRights -notmatch $ACRegex) }
写法2:逻辑展开(运行效率一致)
根据德摩根定律,-not (A -and B -and C)等价于-not A -or -not B -or -not C,展开后写法如下:
$Test | Where-Object { $_.Name -match $NameRegex -or $_.DisplayName -eq 'DisplayName1' -or $_.AccessRights -match $ACRegex }
以上两种写法都会返回你预期的$User1对象,同时完全符合你的排除规则。
原代码无返回的验证
逐个验证三个测试对象是否满足你原来的保留条件:
- $User1:DisplayName为
DisplayName1,$_.DisplayName -ne 'DisplayName1'返回$false,整体条件为$false,不保留 - $User2:Name为
Name2匹配$NameRegex,$_.Name -notmatch $NameRegex返回$false,整体条件为$false,不保留 - $User3:Name为
Name3匹配$NameRegex,$_.Name -notmatch $NameRegex返回$false,整体条件为$false,不保留
因此原代码无任何返回结果。
内容的提问来源于stack exchange,提问作者baswijdenesdotcom
相关产品推荐
相关产品推荐

