PowerShell中ArrayList重复元素计数异常问题求助
统计ArrayList中值的出现次数问题解决
为什么Group命令把所有元素归为一组?
你碰到的这个问题,核心原因是Get-ADUser返回的office属性不是纯字符串——它是ADPropertyValueCollection类型的对象。直接把这类对象丢进ArrayList后,Group-Object会按对象引用而非实际的字符串值来分组,自然就把所有元素归成一组了。
方法一:用Group-Object正确统计
只需要在获取office值的时候转成字符串,就能让Group命令正常工作:
$list = [System.Collections.ArrayList]@() $users = Get-ADUser -LDAPFilter $filter -SearchBase $adPath @params $users | ForEach-Object { # 把office属性转为字符串再添加 $list.Add($_.office.ToString()) | Out-Null } # 分组后输出格式化结果 $list | Group-Object | ForEach-Object { "$($_.Name)=$($_.Count)" }
嫌ArrayList多余?可以直接链式处理,省掉中间集合:
Get-ADUser -LDAPFilter $filter -SearchBase $adPath @params | ForEach-Object { $_.office.ToString() } | Group-Object | ForEach-Object { "$($_.Name)=$($_.Count)" }
方法二:用哈希表实现统计
如果想用哈希表,得注意把键转成字符串,同时正确处理计数递增:
$countMap = @{} $users = Get-ADUser -LDAPFilter $filter -SearchBase $adPath @params $users | ForEach-Object { $office = $_.office.ToString() # 可选:处理空值,避免键为空的情况 if ([string]::IsNullOrWhiteSpace($office)) { $office = "[空值]" } # 计数逻辑:存在则+1,不存在则初始化为1 if ($countMap.ContainsKey($office)) { $countMap[$office]++ } else { $countMap[$office] = 1 } } # 遍历输出结果 $countMap.GetEnumerator() | ForEach-Object { "$($_.Key)=$($_.Value)" }
哈希表常见问题排查
- 重复键错误:检查
office值转字符串后是否有不可见字符,加个$office = $office.Trim()去除前后空白试试。 - 无法递增计数:确保你操作的是数字类型——必须先把
office转成字符串,不能直接用AD属性对象当键,否则哈希表存的是对象,没法递增。
内容的提问来源于stack exchange,提问作者Phaelax
相关产品推荐
相关产品推荐

