PowerShell中-like与-notlike逻辑结果不符问题求助
问题原因分析
你的问题核心出在PowerShell对$null/空值的-like/-notlike处理逻辑,以及遍历的用户属性存在空值的情况:
使用
-like '*CN=ACTIVESTUDENT*'时:- 仅当目标属性(比如用户的
DistinguishedName或组成员的Member属性值)包含指定字符串时返回$true,计入匹配(25786个); - 若属性为
$null或空字符串,-like会返回$false,计入不匹配(220917个)。
- 仅当目标属性(比如用户的
改用
-notlike '*CN=ACTIVESTUDENT*'时:- PowerShell中
$null/空值与任何通配符模式进行-notlike比较,结果依然是$false; - 这就导致:属性包含指定字符串的用户返回
$false,属性为空的用户也返回$false——最终所有用户都被计入“不匹配”,匹配数为0。
- PowerShell中
验证与解决方法
验证空值存在:先统计目标属性为空的用户数量
$studentUsers | Where-Object { [string]::IsNullOrEmpty($_.YourTargetProperty) } | Measure-Object结果应该等于220917,和第一次统计的不匹配数一致。
修正逻辑:要实现“不包含指定字符串”的正确统计,可通过以下两种方式处理:
- 方法1:先过滤空值,再用
-notlike$notMatchUsers = $studentUsers | Where-Object { !([string]::IsNullOrEmpty($_.YourTargetProperty)) -and $_.YourTargetProperty -notlike '*CN=ACTIVESTUDENT*' } - 方法2:强制转为字符串,空值会转为空字符串,此时
-notlike可正常返回$true$notMatchUsers = $studentUsers | Where-Object { [string]$_.YourTargetProperty -notlike '*CN=ACTIVESTUDENT*' }
修正后统计的匹配数会和第一次的不匹配数(220917)一致,两者结果互为逆集。
- 方法1:先过滤空值,再用
内容的提问来源于stack exchange,提问作者SoullessViking
相关产品推荐
相关产品推荐

