You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 18:43:31