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

PowerShell导入CSV循环问题:结果仅包含CSV最后一项

批量导出通讯组成员仅得到最后一项的解决办法

需要从CSV文件导入多个通讯组并导出成员,要求每行对应一组,格式如下:

"Group_name1", "member1, member2,member3"
"Group_name2", "member1,member2,member3"
"Group_name3", "member1,member2,member3"

单组处理脚本运行正常,但添加foreach循环后,结果仅包含CSV中的最后一项。原脚本如下:

#$DL='plum'
$DL_List = "C:\ps1\shared_mailboxes\groups.csv"
$DL_array = (Import-Csv -Path $DL_List).name
foreach ($DL in $DL_array)
{
    $DL_Membership = (Get-DistributionGroupMember -identity $DL).displayName
    if([string]$DL_Membership -ne "")
    {
        $Members = ""
        foreach($DL_Membership in $DL_Membership)
        {
            if($Members -ne "")
            {
                $Members=$Members +","
            }
            $Members = $Members + $DL_Membership
        }
        
    }
}

$ExportCSV=".\group_members_$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).csv"
$Result = @{'Group'=$DL;'Users'=$Members}
$Results = New-Object PSObject -Property $Result
$Results |select-object 'Group','Users' | Export-Csv -Path $ExportCSV -Notype -Append

问题根源

  1. 结果生成逻辑在循环外:循环结束后,$DL和$Members仅保留最后一次循环的变量值,所以最终只导出最后一组数据。
  2. 变量名冲突:嵌套foreach循环中使用了和外层相同的变量名$DL_Membership,会覆盖外层的成员列表变量。
  3. 成员拼接效率低:手动拼接字符串的方式冗余,PowerShell有更简洁的字符串拼接方法。

修正后的脚本

$DL_List = "C:\ps1\shared_mailboxes\groups.csv"
$DL_array = (Import-Csv -Path $DL_List).name
# 初始化空数组存储所有组的结果
$allResults = @()

foreach ($DL in $DL_array) {
    # 获取组成员的显示名称,忽略不存在的组
    $memberNames = (Get-DistributionGroupMember -Identity $DL -ErrorAction SilentlyContinue).displayName
    # 拼接成员为逗号分隔的字符串,空值则返回空字符串
    $members = if ($memberNames) { $memberNames -join "," } else { "" }

    # 创建当前组的结果对象
    $resultObj = [PSCustomObject]@{
        Group = $DL
        Users = $members
    }
    # 将结果加入总数组
    $allResults += $resultObj
}

# 导出所有结果到CSV
$exportPath = ".\group_members_$((Get-Date -Format 'yyyy-MMM-dd-ddd hh-mm tt').ToString()).csv"
$allResults | Select-Object Group, Users | Export-Csv -Path $exportPath -NoTypeInformation

关键修改说明

  • 提前初始化$allResults数组,循环内每次处理完一组就将结果对象加入数组,保留所有组的数据。
  • 用-join ","替代嵌套循环拼接成员列表,代码更简洁高效。
  • 使用[PSCustomObject]直接创建结果对象,比New-Object更直观。
  • 添加-ErrorAction SilentlyContinue避免组不存在时抛出错误中断脚本(可根据需求调整)。
  • 统一导出整个结果数组,无需使用-Append,减少IO操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:15:35