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

递归函数使用Write-Host与存入数组结果不一致问题求助

解决递归获取AD父组时数组与Write-Host输出不一致的问题

这个问题我之前也碰到过,核心原因是PowerShell数组的传递机制和你写的递归逻辑不匹配导致的,我来给你拆解一下:

问题根源

1. 数组的按值传递特性

在PowerShell中,数组作为参数传递时默认是按值传递的。每次你递归调用Get-ADPrincipalGroupMembershipRecursive并传入$list时,实际上传递的是当前$list的一个副本。递归函数内部执行$list += $groupMembership.name时,只是修改了这个副本数组,并不会影响上层函数中的原$list变量。这就导致最终返回的$list只包含了第一层递归添加的组名,深层递归的组根本没被加进去。

2. Write-Host的即时输出特性

Write-Host是直接将当前循环的$groupMembership.name输出到控制台,它不受数组传递的影响——只要循环遍历到某个组,就会立刻输出。所以你能看到所有层级的组名,但数组里只保存了部分结果。

修复方案

这里提供两种常用的解决思路:

方案一:使用引用传递修改原数组

通过[ref]类型将数组以引用方式传递,让递归函数直接修改原数组,而不是操作副本:

function Get-ADPrincipalGroupMembershipRecursive ($groupName, [ref]$list) {
    $groupsMembership = Get-ADPrincipalGroupMembership $groupName
    foreach ($groupMembership in $groupsMembership) {
        Write-Host $groupMembership.name
        # 直接修改引用指向的原数组
        $list.Value += $groupMembership.name
        # 递归调用时继续传递引用
        Get-ADPrincipalGroupMembershipRecursive -groupName $groupMembership -list $list
    }
}

调用方式:

# 初始化空数组
$groupList = @()
# 以引用方式传递数组
Get-ADPrincipalGroupMembershipRecursive -groupName "你的组名" -list ([ref]$groupList)
# 查看最终结果
$groupList

方案二:利用返回值累加所有结果

让递归函数返回当前层级和所有子层级的组名数组,上层函数将返回的数组合并,这种方式更符合PowerShell的管道式思维:

function Get-ADPrincipalGroupMembershipRecursive ($groupName) {
    $groupsMembership = Get-ADPrincipalGroupMembership $groupName
    # 收集当前层级的组名
    $allGroups = $groupsMembership.name
    # 输出当前层级的组名(和原逻辑一致)
    $allGroups | ForEach-Object { Write-Host $_ }
    # 递归获取子层级的组名并合并
    foreach ($groupMembership in $groupsMembership) {
        $allGroups += Get-ADPrincipalGroupMembershipRecursive -groupName $groupMembership
    }
    # 可选:去重(如果存在重复的组嵌套)
    $allGroups = $allGroups | Select-Object -Unique
    return $allGroups
}

调用方式:

$groupList = Get-ADPrincipalGroupMembershipRecursive -groupName "你的组名"
$groupList

内容的提问来源于stack exchange,提问作者mytDRAGON

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:20:52