PowerShell多层foreach循环导出CSV的输出格式调整问询
原脚本仅能导出带USERS表头的单列用户数据,调整后可实现按站点分组、无表头逐行排列的导出效果,导出文件内容顺序为「站点地址→站点下所有用户登录名→下一个站点地址→对应用户」。
调整后完整脚本
Add-PSSnapin microsoft.sharepoint.powershell -ErrorAction SilentlyContinue # 配置待读取的站点列表CSV路径 [parameter(Mandatory=$false)][string]$CsvFilePath = ".\AllSiteCollectionsLocal.csv" $csvItems = Import-Csv $CsvFilePath $resultsarray = @() # 遍历CSV中记录的每个站点集合 foreach($Item in $csvItems) { $site = New-Object Microsoft.SharePoint.SPSite($Item.SiteCollection) $web = $site.OpenWeb() $siteUsers = $web.SiteUsers Write-Host $Item.SiteCollection -ForegroundColor Green # 优先写入当前站点地址作为分组标识行 $resultsarray += $Item.SiteCollection # 逐行追加当前站点下的所有用户登录名 foreach($user in $siteUsers) { Write-Host $user.LoginName $resultsarray += $user.LoginName } $web.Dispose() $site.Dispose() } # 所有内容收集完成后一次性导出为无表头纯文本格式 $resultsarray | Out-File -Path c:\temp\sitesandusers.csv -Encoding UTF8
关键改动说明
- 删除了原脚本中创建带
USERS属性PSObject的逻辑,不再生成结构化列数据,直接收集需要逐行展示的纯文本内容,从根源上避免CSV表头生成 - 调整内容写入顺序:外层循环处理每个站点时,先把站点地址写入结果集,再遍历追加该站点下的所有用户,自动实现按站点分组的排列效果
- 把文件导出操作移到所有站点遍历完成后执行,修复原脚本每次内层循环结束就重复覆盖导出文件的逻辑bug
- 改用
Out-File做纯文本导出,指定UTF8编码避免特殊字符乱码,导出的csv文件完全符合无表头、逐行分组的要求
内容的提问来源于stack exchange,提问作者obautista
相关产品推荐
相关产品推荐

