PowerShell中Get-ADUser使用-in、-contains操作符结果与-match不一致问题
异常原因
核心问题是 $depart 变量的存储内容和类型不符合 -in、-contains 操作符的匹配逻辑:
- 你通过
Get-ADUser -filter "enabled -eq 'false'" -properties * | Select -Property SamAccountName得到的是 自定义PSObject对象数组,数组的每个元素是携带SamAccountName属性的结构化对象,不是纯账号名字符串数组。 -in和-contains属于 全等匹配操作符,会同时对比元素的类型和值:你拿字符串类型的$item和数组中的PSObject对象做对比,二者类型完全不同,所以永远返回$false,这就是结果异常的根本原因。-match操作符处理数组输入时,会先将数组的每个元素隐式转换为字符串再做正则匹配:PSObject转字符串的默认输出格式为@{SamAccountName=实际账号名},你的$item是账号名字符串,刚好能匹配到转换后字符串里的对应内容,所以能返回正确结果。
修复方案
只需要调整$depart的取值逻辑,直接提取纯账号名字符串数组即可:
# 使用Select-Object的-ExpandProperty参数直接提取属性值,得到纯字符串数组 $depart = get-aduser -filter "enabled -eq 'false'" -properties * | Select -ExpandProperty SamAccountName
也可以在判断时显式访问对象的SamAccountName属性:
# 第一种判断方式调整 if ($item -in $depart.SamAccountName) { ... } # 第二种判断方式调整 if ($depart.SamAccountName -contains $item) { ... }
内容的提问来源于stack exchange,提问作者clin
相关产品推荐
相关产品推荐

