Exchange Online大邮箱及大文件夹报表导出脚本问题排查
问题分析与修正脚本
原脚本核心问题
- 筛选邮箱时仅保留
DisplayName,导致后续无法获取ItemCount和TotalItemSize属性 - 未按需求筛选超过1GB的文件夹及子文件夹,仅取了前5个最大文件夹
- 嵌套对象(
TopFolders)直接导出CSV会显示为无效的System.Object[],无法查看实际数据
修正后的完整脚本
# 导出CSV路径 $ExportPath = "C:\EXO\40GBFile.csv" # 清理旧文件(避免重复追加数据) if (Test-Path $ExportPath) { Remove-Item $ExportPath -Force } # 获取总容量超过40GB的邮箱统计信息,保留必要属性 $LargeMailboxes = Get-EXOMailboxStatistics -ResultSize Unlimited | Where-Object { $_.TotalItemSize.Value.ToBytes() -gt 40GB } | Select-Object DisplayName, ItemCount, TotalItemSize, MailboxGuid foreach ($Mailbox in $LargeMailboxes) { Write-Host "正在处理邮箱: $($Mailbox.DisplayName)" # 获取该邮箱所有文件夹及子文件夹统计,过滤大小超过1GB的文件夹 $LargeFolders = Get-EXOMailboxFolderStatistics -Identity $Mailbox.MailboxGuid | Where-Object { $_.TotalFolderSize -ne $null -and $_.TotalFolderSize.Value.ToBytes() -gt 1GB } | Select-Object FolderName, FolderPath, ItemsInFolder, TotalFolderSize # 为每个大文件夹生成独立记录,确保CSV可正常读取 foreach ($Folder in $LargeFolders) { $OutputObject = [PSCustomObject]@{ 邮箱名称 = $Mailbox.DisplayName 邮箱总项目数 = $Mailbox.ItemCount 邮箱总容量 = $Mailbox.TotalItemSize.Value.ToString() 文件夹名称 = $Folder.FolderName 文件夹路径 = $Folder.FolderPath 文件夹项目数 = $Folder.ItemsInFolder 文件夹容量 = $Folder.TotalFolderSize.Value.ToString() } # 追加到CSV文件 $OutputObject | Export-Csv -Path $ExportPath -Append -NoTypeInformation -Encoding UTF8 } } Write-Host "导出完成,结果已保存至: $ExportPath"
关键修正说明
邮箱筛选优化:
- 直接调用
Get-EXOMailboxStatistics获取统计数据,减少冗余操作 - 保留
MailboxGuid作为标识(比DisplayName更可靠,避免重名冲突),同时保留ItemCount和TotalItemSize属性 - 使用数值
40GB直接比较,无需额外字符串转换
- 直接调用
文件夹处理:
- 添加条件筛选超过1GB的文件夹,同时判断
TotalFolderSize不为空,避免系统文件夹空值报错 - 增加
FolderPath字段,明确子文件夹层级关系
- 添加条件筛选超过1GB的文件夹,同时判断
CSV导出优化:
- 每个大文件夹生成独立CSV记录,解决嵌套对象无法显示的问题
- 将容量转换为可读字符串(如"1.2 GB"),提升报表可读性
- 使用
UTF8编码避免中文乱码,处理前清理旧文件防止数据重复
内容的提问来源于stack exchange,提问作者David Moreau
相关产品推荐
相关产品推荐

