执行Exchange Online邮箱统计脚本时遇空值表达式调用错误
修复Exchange Online邮箱统计脚本的空值错误
错误原因
出现You cannot call a method on a null-valued expression错误的核心原因有两个:
- 部分邮箱(如存档邮箱、已禁用邮箱、未初始化的邮箱)执行
Get-ExoMailboxStatistics时会返回null,后续调用$Mbx.ItemCount、$Mbx.TotalItemSize等属性就会触发空值错误。 - 即使
$Mbx有返回值,TotalItemSize属性也可能为null,直接调用.value.ToBytes()方法必然报错。
修复后的脚本
# 使用ArrayList提升性能,避免数组拼接的低效问题 $Results = New-Object System.Collections.ArrayList # 获取所有邮箱,过滤掉可能无统计数据的特殊邮箱类型 $MbxUsers = Get-EXOMailbox -ResultSize Unlimited | Where-Object { $_.RecipientTypeDetails -notin @('MailboxPlan', 'DiscoveryMailbox', 'PublicFolderMailbox') } foreach($user in $MbxUsers) { # 尝试获取邮箱统计,捕获可能的异常 try { $Mbx = Get-ExoMailboxStatistics -Identity $user.UserPrincipalName -ErrorAction Stop # 处理TotalItemSize的空值情况 if ($Mbx.TotalItemSize) { $totalSizeGB = [math]::Round($Mbx.TotalItemSize.Value.ToBytes()/[math]::Pow(1024, 3), 3) } else { $totalSizeGB = 0 } $Properties = @{ DisplayName = $user.DisplayName Userprincipalname = $user.UserPrincipalName PrimarySmtpAddress = $user.PrimarySmtpAddress EmailAddresses = $user.EmailAddresses -join ';' # 将多邮箱地址转为字符串,避免CSV导出格式异常 Alias = $user.Alias RecipientTypeDetails = $user.RecipientTypeDetails ItemCount = $Mbx.ItemCount ?? 0 # 空值合并,null时设为0 TotalItemSize = $totalSizeGB MailboxGuid = $Mbx.MailboxGuid ?? '' } [void]$Results.Add((New-Object psobject -Property $Properties)) } catch { # 输出错误信息,方便排查问题邮箱 Write-Warning "无法获取邮箱 $($user.UserPrincipalName) 的统计信息:$($_.Exception.Message)" } } # 导出CSV,确保列顺序正确 $Results | Select-Object DisplayName,Alias,Userprincipalname,PrimarySmtpAddress,EmailAddresses,ItemCount,TotalItemSize,RecipientTypeDetails,MailboxGuid | Export-Csv -NoTypeInformation -Encoding UTF8 -Path .\MailboxSize.csv
关键修复点
- 空值处理:对
$Mbx、TotalItemSize、ItemCount等属性做空值判断,避免调用null对象的方法。 - 异常捕获:用
try/catch包裹统计信息获取逻辑,遇到无法处理的邮箱时输出警告,不中断整个脚本执行。 - 性能优化:改用
System.Collections.ArrayList存储结果,比原脚本的数组拼接$Results +=效率更高,尤其适用于邮箱数量较多的场景。 - CSV兼容性:将
EmailAddresses数组用分号拼接为字符串,避免导出CSV时出现格式混乱。
内容的提问来源于stack exchange,提问作者Jai Nair
相关产品推荐
相关产品推荐

