Public/Get-MailboxScaleReport.ps1

<#
    .DESCRIPTION
    Get a mailbox report to help with troubleshooting where a mailbox may have exceeded outlook limits
 
    .PARAMETER MailboxAliases
    Array of aliases for mailboxes to pull a report from if not all
 
    .PARAMETER Path
    Where to export the excel file to
 
    .EXAMPLE
    Get-MailboxScaleReport -Path C:\report.xlsx
 
    Gets a report for all mailboxes
 
    .EXAMPLE
    Get-MailboxScaleReport -Path C:\report.xlsx -MailboxAliases JSmith
 
    Gets a report for one mailbox
 
    .EXAMPLE
    Get-MailboxScaleReport -Path C:\report.xlsx -MailboxAliases JOSmith, JASmith, SSmith
 
    Gets a report for some but not all mailboxes
 
    .NOTES
    Must have the Exchange and importexcel modules loaded. \
    Microsoft outlined limitations for mailboxes based on exchange versions noted below. \
    * Exchange 2007: 50000 messages per folder, 500 folders total
    * Exchange 2010/2013/2016/2019: 100000 messages per folder, 500 folders total
 
    .Link
    https://github.com/TheTaylorLee/AdminToolbox
#>


Function Get-MailboxScaleReport {

    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]$Path,
        [Parameter(Mandatory = $false)]$MailboxAliases
    )

    $ErrorActionPreference = 'silentlycontinue'

    if ($null -eq $MailboxAliases) {
        $MailboxAliases1 = get-mailbox | Select-Object alias | Sort-Object alias
        $MailboxAliases2 = $MailboxAliases1.alias

        foreach ($MailboxAlias in $MailboxAliases2) {
            $Mailfolderstats = Get-MailboxFolderStatistics $MailboxAlias | Select-Object *
            $FolderCount = ($Mailfolderstats | Select-Object Name).count
            $FolderCount | Export-Excel -WorksheetName "$MailboxAlias" -Path "$Path" -FreezeTopRow -TableName "$mailboxalias Folder Count" -AutoSize -Title "$mailboxalias Folder Count" -TitleSize 11 -TitleBold
            $Mailboxstats = Get-MailboxStatistics $MailboxAlias | Select-Object Totalitemsize, itemcount
            $Mailboxstats | Export-Excel -WorksheetName "$MailboxAlias" -Path "$Path" -FreezeTopRow -TableName "$MailboxAlias MailboxSize" -AutoSize -Title "$mailboxalias MailboxSize" -TitleSize 11 -TitleBold  -StartRow 4
            $Mailfolderstats | Select-Object Name, FolderandSubFolderSize, ItemsinFolderandSubfolders | Export-Excel -WorksheetName "$MailboxAlias" -Path "$Path" -FreezeTopRow -TableName "$mailboxalias Folders" -AutoSize -StartColumn 4
        }
    }

    else {
        foreach ($MailboxAlias in $MailboxAliases) {
            $Mailfolderstats = Get-MailboxFolderStatistics $MailboxAlias | Select-Object *
            $FolderCount = ($Mailfolderstats | Select-Object Name).count
            $FolderCount | Export-Excel -WorksheetName "$MailboxAlias" -Path "$Path" -FreezeTopRow -TableName "$mailboxalias Folder Count" -AutoSize -Title "$mailboxalias Folder Count" -TitleSize 11 -TitleBold
            $Mailboxstats = Get-MailboxStatistics $MailboxAlias | Select-Object Totalitemsize, itemcount
            $Mailboxstats | Export-Excel -WorksheetName "$MailboxAlias" -Path "$Path" -FreezeTopRow -TableName "$MailboxAlias MailboxSize" -AutoSize -Title "$mailboxalias MailboxSize" -TitleSize 11 -TitleBold  -StartRow 4
            $Mailfolderstats | Select-Object Name, FolderandSubFolderSize, ItemsinFolderandSubfolders | Export-Excel -WorksheetName "$MailboxAlias" -Path "$Path" -FreezeTopRow -TableName "$mailboxalias Folders" -AutoSize -StartColumn 4
        }
    }

    $ErrorActionPreference = 'continue'
}