Tuesday, June 21, 2016

Reporting Document Version Sizes in SharePoint 2007 via PowerShell

Here's some PowerShell to crawl SharePoint 2007 webs to report on all document libraries, the documents, and the versions. The output csv can then be opened in Excel and filtered, pivoted, etc.

Paste the code below into a .ps1 file, and call it from a PowerShell prompt on a WFE in the SharePoint 2007 farm.
Param(
  [Parameter(Mandatory=$true)] [string]$siteCollectionUrl = 'http://rootweb',
  [string]$delimiter = "`t",
  [int]$maxWebs = 200
)
$dateStr = '{0:yyyyMMdd-HHmm}' -f $(Get-Date)
$outfile = "VersionSizeReport_$dateStr.csv"
function MAIN
{
  #Call the Function to Generate Version History Report
  GenerateVersionSizeReport $siteCollectionUrl
}
[void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") > $null
Function Get-SPWebApplication()
{
  Param( [Parameter(Mandatory=$true)] [string]$WebAppURL )
  return [Microsoft.SharePoint.Administration.SPWebApplication]::Lookup($WebAppURL)
}

Function global:Get-SPSite()
{
  Param( [Parameter(Mandatory=$true)] [string]$SiteCollURL )
  if($SiteCollURL -ne '')
  {
    return new-Object Microsoft.SharePoint.SPSite($SiteCollURL)
  }
}
Function global:Get-SPWeb()
{
  Param( [Parameter(Mandatory=$true)] [string]$SiteURL )
  $site = Get-SPSite($SiteURL)
  if($site -ne $null)
  {
    $web=$site.OpenWeb();
  }
  return $web
}

Function GenerateVersionSizeReport()
{  
  Param( [Parameter(Mandatory=$true)] [string]$WebAppURL )
  $WebApp=Get-SPWebApplication($WebAppURL)

  #Write the CSV Header - Tab Separated
  "Site Name$($delimiter)Library$($delimiter)File URL$($delimiter)File Type$($delimiter)Last Modified$($delimiter)Item Versions$($delimiter)File Versions$($delimiter)Latest Version Size(MB)$($delimiter)Versions Size(MB)$($delimiter)Total File Size(MB)" |
    out-file $outfile

  #Loop through each site collection
  foreach($Site in $WebApp.Sites)
  {
    $webCount = 0
    foreach($Web in $Site.AllWebs)
    {
      $webCount++
      if (($webCount -le $maxWebs) -and ($webCount -ne -1))
      {
        Write-Host "WEB: $($Web.url)"
        foreach ($List in $Web.Lists)
        {
          Write-Host "`nLIST (Items:$($List.ItemCount), Type:$($List.BaseType)): $($Web.url)$($List.RootFolder.ServerRelativeUrl)"
          #if ( ($List.BaseType -eq "DocumentLibrary") -and ($List.Hidden -eq $false) )
          if ($List.BaseType -eq "DocumentLibrary")
          #if ($List.EnableVersioning -eq $true)
          {
            $itemNum = 0
            Write-Host "`t" -noNewLine
         
            foreach ($ListItem  in $List.Items)
            {
              $itemNum++
              if (-not ($itemNum % 10))
              {
                Write-Host "$itemNum " -noNewLine
              }
              if (-not ($itemNum % 200))
              {
                Write-Host "`n`t" -noNewLine
              }
              $versionSize=0

              #Get the versioning details
              foreach ($FileVersion in $ListItem.File.Versions)
              {
                $versionSize = $versionSize + $FileVersion.Size;
              }
              #To Calculate Total Size(MB)
              $TotalFileSize= [Math]::Round(((($ListItem.File.Length + $versionSize)/1024)/1024),2)
             
              #Convert Size to MB
              $VersionSize= [Math]::Round((($versionSize/1024)/1024),2)
             
              #Get the Size of the current version
              $CurrentVersionSize= [Math]::Round((($ListItem.File.Length/1024)/1024),2)
             
              #Get Site Name
              if ($Web.IsRootWeb -eq $true)
              {
                $siteName = $Web.Title +" - Root";
              }
              else
              {
                $siteName= $Site.RootWeb.Title + " - " + $Web.Title;
              }

              "$($siteName)"`
              + "$($delimiter)$($List.RootFolder.ServerRelativeUrl)"`
              + "$($delimiter)$($Web.Url)/$($ListItem.Url)"`
              + "$($delimiter)$($ListItem['File Type'].ToString())"`
              + "$($delimiter)$($ListItem['Modified'].ToString())"`
              + "$($delimiter)$($ListItem.Versions.Count)"`
              + "$($delimiter)$($ListItem.File.Versions.Count)"`
              + "$($delimiter)$CurrentVersionSize"`
              + "$($delimiter)$versionSize"`
              + "$($delimiter)$TotalFileSize"`
              | Out-File $outfile -Append
            }
          }
        } #webcount maxcount
      }
    $Web.Dispose()      
    }
  $Site.Dispose()      
  }
  write-host "`n`nVersioning Report Generated Successfully!`n$outfile"
}

MAIN


No comments: