You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 00:43:12