This script queries each public folder replica for its item count. It will query replicas from Exchange 2003 via WMI, and 2007/2010 via native Exchange PowerShell cmdlets.  To ensure a successful and accurate completion, the execution credentials must have local admin and Exchange admin rights for any Exchange 2003 server based replicas, at least local admin rights and Exchange Public Folder Administrator role for any Exchange 2007 server based replicas, and at least be assigned the Public Folder Management role for any Exchange 2010 server based replicas.
Script takes two parameters as input.
  1. path:  This specifies the public folder you wish to target.  Be sure to specify the complete path.  This parameter is required.
  2. Recurse:  This specified whether or not to recurse and get metrics for each descendant folder.  This parameter is not required.

You can also use the get-help cmdlet to view more information regarding the script usage.

 
PowerShell
Edit|Remove
# ------------------------------------------------------------- 
# Script     : get-PublicFolderReplicaItemCounts.ps1 
# Author     : Seth Brandes - seth.brandes@microsoft.com 
# Date       : 12/13/2011 
# Copyright  : 2011, Microsoft Corporation 
# Disclaimer : USE AS-IS AT YOUR OWN RISK 
# ------------------------------------------------------------- 
 
<#   
.SYNOPSIS   
    Provides a per replica item count for a public folder or folder tree. 
.DESCRIPTION   
    This script queries each public folder replica for its item count. It will query replicas 
    from Exchange 2003 via WMI, and 2007/2010 via native Exchange PowerShell cmdlets.  To ensure 
    a successful and accurate completion, the execution credentials must have local admin and Exchange admin 
    rights for any Exchange 2003 server based replicas, at least local admin rights and Exchange 
    Public Folder Administrator role for any Exchange 2007 server based replicas, and at least 
    be assigned the Public Folder Management role for any Exchange 2010 server based replicas. 
.NOTES   
    File Name  : get-PublicFolderReplicaItemCounts.ps1 
    Author     : Seth Brandes - seth.brandes@microsoft.com   
.EXAMPLE 
    C:\Scripts>.\Get-PublicFolderReplicaItemCounts.ps1 -Path "\Legal\Documents\Pending Litigation" 
    This example returns the item counts of all replicas for the Pending Litigation public folder 
    from \Legal\Documents\.     
.EXAMPLE 
    C:\Scripts>.\Get-PublicFolderReplicaItemCounts.ps1 -Path "\Legal\Documents" -Recurse 
    This example returns the item counts of all replicas of the \Legal\Documents\ public folder 
    as well as each descendant folder under it.     
.PARAMETER Path 
    The Path parameter specifies the full path of the folder or folder tree you wish to obtain 
    replica statistics for. Specify the path using the format '\TopLevelPublicFolder\PublicFolder'. 
    This parameter is required. 
.PARAMETER Recurse 
    The Recurse parameter specifies that the command must return the specified public folder and all its children. 
    You don't need to specify a value with this parameter. 
    This parameter is not required. 
#>   
 
#get our input parameters from the command line 
Param( 
    #full PF path 
    [Parameter(Mandatory=$true)] 
    [ValidateNOtNullOrEmpty()] 
    [string] $Path, 
    #do we recurse? 
    [switch$Recurse 
    ) 
if($recurse#recurse was requested, get the folder and all of its descendants 
    { 
    $pfCollection = Get-PublicFolder $Path -ErrorAction silentlycontinue -recurse | Select identity,replicas,@{Name="LegPFDN"; Expression = {$_.identity.legacyDistinguishedName}} 
    } 
else #recurse was not requested, get only the folder defined 
    { 
    $pfCollection = Get-PublicFolder $Path -ErrorAction silentlycontinue | Select identity,replicas,@{Name="LegPFDN"; Expression = {$_.identity.legacyDistinguishedName}} 
    } 
if(!$pfCollection#validate a folder path was actually found, if not exit the script 
    { 
    Write-Host "ERROR! Could not find folder path: $path" 
    Write-Host "Please use a valid folder path." 
    exit 
    } 
$pfResults = @()  #define the array containing our results 
$ReplicasObj = new-object system.object  #create construct to store what will become our column headers for the results array 
Add-Member -InputObject $ReplicasObj -MemberType NoteProperty "Folder Path" "" 
foreach ($pf in $pfCollection#loop through each in folder in the hirarchy collection. (if not recurse, just the folder specified) 
    { 
    $tmpObj = New-Object system.object     #create temp object to store information about replica 
    #add the name of the folder including the full path 
    Add-Member -InputObject $tmpObj -MemberType NoteProperty "Folder Path" $pf.Identity 
    foreach ($replica in $pf.replicas) #step through each replica of the folder 
        { 
        #store replica's server name into variable for use below. 
        $replicaServer = (Get-PublicFolderDatabase $replica.distinguishedname).server.name 
        #add server to Replicas object to be used as the column headers for the $pfresults array 
        Add-Member -InputObject $ReplicasObj -MemberType NoteProperty $replicaServer "" -ErrorAction SilentlyContinue 
        #deterimine which version of exchange the replica is homed on (as defined in KB158530) 
        if ( (get-exchangeserver $replicaServer).admindisplayversion.major -lt 8) 
            { #Exchange 2003 server 
            #grab item count via WMI since get-publicfolderstatistics will not work against a 2003 server.  Store result in the temp object. 
            add-member -inputObject $tmpObj -membertype NoteProperty $replicaserver (Get-WmiObject -ComputerName $replicaServer -Namespace "root\MicrosoftExchangeV2" -Class "Exchange_PublicFolder" -Filter "targetaddress = ""$($pf.legPFDN)""").messagecount 
            } 
        else 
            { #Exchange 2007 or 2010 server 
            #grab item count via get-publicfolderstatistics since replica is on 2007 or 2010.  Store result in the temp object. 
            add-member -inputObject $tmpObj -membertype NoteProperty $replicaserver (Get-PublicFolderStatistics $pf.legPFDN -Server $replicaserver).itemcount 
            } 
        } #end replicas loop 
    $pfResults +$tmpObj    #dump the content of the temp object into the results array 
} #end pf loop 
$pfResults = @($replicasObj,$pfResults#prepend the ReplicasObject to the beginning of the array to guarentee display all replica columns 
$pfResults #output the results of the array containing the folder(s') replica item count metrics in native table format