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
问题根源
- 结果生成逻辑在循环外:循环结束后,
$DL和$Members仅保留最后一次循环的变量值,所以最终只导出最后一组数据。 - 变量名冲突:嵌套
foreach循环中使用了和外层相同的变量名$DL_Membership,会覆盖外层的成员列表变量。 - 成员拼接效率低:手动拼接字符串的方式冗余,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
相关产品推荐
相关产品推荐

