Show object sizes in bytes (or MB) in PowerShell with Office 365

Convert Exchange Online item sizes to plain MB values in PowerShell by parsing the byte string, so mailbox and folder sizes export cleanly to CSV.

PowerShell can be a very powerful tool when applied correctly, however it has some quirks - one of which is formatting size numbers for remote PowerShell connections to Office 365.

By default, when you get a list of item sizes (e.g. mailbox sizes, or mailbox folder sizes etc), PowerShell helpfully formats the size for you as a human-readable value. This is nice when you’re outputting to the console, but infuriating when you’re outputting to, say, a CSV that you then need to manipulate.

As an example - I’m trying to add up the size of all Public Folders in a client’s Exchange Online tenancy.

This command does exactly what I want:

Get-PublicFolderStatistics | Select-Object Name, FolderPath, ItemCount, TotalItemSizeMB

Well, almost - it displays the sizes like this:

422.2 MB (442,706,389 bytes)

This is OK when I’m reading it on the screen, not so much when I want to export use Export-CSV and manipulate it in Excel.

As it turns out, TotalItemSize has a property whereby it can convert to a standard, consistent unit like MB. This property only works however when running it against an on-prem Exchange server, not with Exchange Online. it doesn’t return an error, it just doesn’t return any sizes if you use something simple like this:

@{Name=“TotalItemSizeMB”;Expression={$_.TotalItemSize.Value.ToMB()}}

So, we need to get considerably more complicated and work with the string value that we’re given for the size instead

@{Name=“TotalItemSizeMB”; Expression={[math]::Round(($_.TotalItemSize.ToString().Split(”(”)[1].Split(” ”)[0].Replace(”,”,"")/1MB),0)}}

That was simple, wasn’t it?

The full command, including exporting it to a CSV then becomes:

Get-PublicFolderStatistics | Select-Object Name, FolderPath, ItemCount, @{Name=“TotalItemSizeMB”; Expression={[math]::Round(($_.TotalItemSize.ToString().Split(”(”)[1].Split(” ”)[0].Replace(”,”,"")/1MB),0)}} | Export-CSV .\foldersizes.csv

Couldn’t be easier, right?

Comments