A user had problems syncing Outlook with his IMAP account and I suspect it is because he has a very large numbers of folders. While we could count the folders one by one, it's easier to run a script to get a count. I have a VBA version at Print a list of your Outlook folders but PowerShell is easier to run because it does not require changing macro security.
This PowerShell script counts your Outlook folders and lists them in the PowerShell window, along with the total folder count. The script skips hidden folders Outlook uses for company contacts, quick steps and more. It includes RSS folders, which will run up your folder count if you are using RSS Feeds. The mailbox root folder (typically your email address) is included is the count, so subtract 1.
Outlook Folder Count Summary:
----------------------------
someone@slipstick.com contains 161 folders (including itself)
----------------------------
Total visible folders in Outlook: 161
You can either get the folder count from your default (or only) data file or you can select the Inbox (or another folder such as Drafts or Deleted Items) in another data file before running it. Comment out the default folder line and uncomment the current folder line.
# Get default folders $inbox = $ns.GetDefaultFolder(6) #Inbox # to get the account in a non-default data file, select the inbox or another default folder #$inbox = ($Outlook.ActiveExplorer()).CurrentFolder
PowerShell script to count Outlook folders
clear $outlook = New-Object -ComObject Outlook.Application $ns = $outlook.GetNamespace("MAPI") $PropName = "http://schemas.microsoft.com/mapi/proptag/0x10F4000B" # Function to recursively count folders function Count-Folders($folder) { $count = 1 # Count the current folder # only list visible folders # true = hidden, false = visible $oPA = $Folder.PropertyAccessor $value = $oPA.GetProperty($PropName) If ($value -ne $true) { write-host $Folder.Name # If the folder has subfolders, count them too if ($folder.Folders.Count -gt 0) { foreach ($subfolder in $folder.Folders) { $count += Count-Folders $subfolder } } return $count } } # Get all folder counts $folderCounts = @{} $rootFolders = @() # Get default folders $inbox = $ns.GetDefaultFolder(6) #Inbox # to get the account in a non-default data file, select the inbox or another default folder #$inbox = ($Outlook.ActiveExplorer()).CurrentFolder $rootFolders += $inbox.Parent # Process each root folder foreach ($rootFolder in $rootFolders ) { $totalCount = Count-Folders $rootFolder $folderCounts.Add($rootFolder.Name, $totalCount) } # Display results Write-Host "" Write-Host "Outlook Folder Count Summary:" Write-Host "----------------------------" $totalFolders = 0 foreach ($key in $folderCounts.Keys) { Write-Host "$key contains $($folderCounts[$key]) folders (including itself)" $totalFolders += $folderCounts[$key] } Write-Host "----------------------------" Write-Host "Total visible folders in Outlook: $totalFolders" # Clean up COM objects [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ns) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($outlook) | Out-Null [System.GC]::Collect() [System.GC]::WaitForPendingFinalizers()
Include item count and parent folder name
If you are using this to identify folders you aren't using you can include the item count after the folder name. If you are having trouble finding the folders, you can include the parent folder name.
someone@slipstick.com \ Shopping Messages: 40
Shopping \ Purchases Messages: 431
Shopping \ Dell Messages: 2
Shopping \ Ebay Purchases Messages: 28
Shopping \ Business Expenses Messages: 5
To make the change, add $Folder.parent.name and $folder.items.count to the write-host line, as in the snippet below.
I also wanted to skip the RSS folders and added an AND statement that also checks the folder name and skips any folder under RSS Feeds. By filtering out the RSS feeds, I dropped my folder count to 57. (Time to delete a bunch of RSS feeds!)
If ($value -ne $true) { write-host $Folder.parent.name '\' $Folder.Name ' Messages:' $folder.items.count # If the folder has subfolders, count them too if (($folder.Folders.Count -gt 0) -AND ($folder.name -ne "RSS Feeds")) { foreach ($subfolder in $folder.Folders) { $count += Count-Folders $subfolder } } return $count } }
Using PowerShell Scripts
To use PowerShell scripts with Outlook, start typing PowerShell on the start menu and open Windows PowerShell when it comes up. Windows PowerShell ISE has a script pane at the top, which is useful if you want to edit the script.
Paste the entire script in the PowerShell window and press Enter or the Run button if using PowerShell ISE.
Note: PowerShell scripts will not work with new Outlook or Outlook on the web.
Saving PowerShell Scripts
If you want to save the script as a .ps1 file, paste it into Notepad and save it with the extension .ps1. To open it in the PowerShell IDE, type PowerShell on the start menu and click on Windows PowerShell IDE when the PowerShell app is found. Paste the script in the editing window.
To use it, you need to allow local scripts by running this command:
Set-ExecutionPolicy RemoteSigned
To run your saved .ps1 file, right-click on the script and choose Run with PowerShell.