PowerShell共享邮箱统计脚本仅导出单条数据问题排查
问题分析与修正方案
我帮你排查下代码里的问题,这几个点导致你只得到一条数据:
核心问题1:循环内重置结果数组
你在foreach循环里每次都执行了$strUserDetails = @(...),这会把之前收集到的所有数据清空,相当于每次循环都重新创建一个空数组,最后自然只剩最后一次循环生成的对象。要把数组初始化放到循环外面,循环内只做追加操作。
核心问题2:UPN获取的冗余与错误
$upn = Get-Mailbox $mbx.DisplayName | Select UserPrincipalName完全没必要——$mbx本身就是Get-Mailbox返回的对象,直接用$mbx.UserPrincipalName就能拿到UPN,而且你现在存的是一个带属性的对象,不是字符串,导出CSV后会显示@{UserPrincipalName=xxx}这种奇怪的内容。
其他小问题
SubStrin拼写错了,应该是Substring;- 变量名
$ItemSizeString和$itemSizeString大小写不一致,虽然PowerShell不严格,但容易搞混; - 用
$mbx.DisplayName去查邮箱统计信息不够可靠,万一有重名邮箱就会出错,直接用$mbx.Identity更稳妥。
修正后的完整代码
Function Shared { # 初始化结果数组,放在循环外面避免每次重置 $strUserDetails = @() # 用Join-Path处理路径,比直接拼接更安全 $Filename = Join-Path -Path $Save_Path -ChildPath $SFilename $Shared_MBX = Get-Mailbox -RecipientType SharedMailbox -ResultSize Unlimited -SortBy Name foreach ($mbx in $Shared_MBX) { # 直接从现有对象取UPN,不用重复调用Get-Mailbox $upn = $mbx.UserPrincipalName # 用Identity获取统计信息,避免重名问题 $UserMailbox = Get-MailboxStatistics -Identity $mbx.Identity | Select-Object DisplayName, ItemCount, TotalItemSize $ItemSizeString = $UserMailbox.TotalItemSize.ToString() # 修正拼写,统一变量大小写 $sizeInBytes = $ItemSizeString.Substring( $ItemSizeString.IndexOf("(") + 1, $ItemSizeString.IndexOf(" bytes") - ($ItemSizeString.IndexOf("(") + 1) ).Replace(",", "") $strMailboxSize = "{0:N2}" -f [double]$sizeInBytes # 用PSCustomObject创建对象,语法更简洁 $strUserDetails += [PSCustomObject]@{ Name = $upn Items = $UserMailbox.ItemCount Size = $strMailboxSize } } $strUserDetails | Export-Csv -NoTypeInformation -Append -Path $Filename }
另外补充两个优化点:
- 用
Join-Path拼接路径,能自动处理Windows/Linux的路径分隔符,避免手动拼接出错; [PSCustomObject]比New-Object更高效,语法也更直观,PowerShell 3.0及以上都支持。
内容的提问来源于stack exchange,提问作者Billy Smith
相关产品推荐
相关产品推荐

