Get SharePoint Documents Inventory Report with PowerShell

This PowerShell script generates detailed report on the given SharePoint library’s inventory in addition with its storage data. The output report contains:

  • File Name
  • File Size(KB)
  • Versions Size(KB)
  • Total File Size(KB)
  • Created on
  • Last Modified
  • Created by
  • Parent Folder
  • URL
SharePoint Document Library Inventory using PowerShell

SharePoint Document Library Inventory using PowerShell

Add-PSSnapin Microsoft.SharePoint.PowerShell -erroraction SilentlyContinue

# Function to retrieve detailed Library storage Report
Function GetLibraryStorageRpt($Folder)
{
    #Array to hold Storage data for all files
    $StorageDataCollection = @()
    
    $FileSize = 0
    $TotalFileSize = 0
    foreach ($File in $Folder.Files)
    {
        #Get File Size
        $FileSize = $File.TotalLength
        
        $VersionSize = 0
        #Get the Versions Size
        foreach ($FileVersion in $File.Versions)
        {
            $VersionSize +=$FileVersion.Size
        }
        $TotalFileSize = $FileSize + $VersionSize
  
        $StorageDataResult = New-Object PSObject
 
        $StorageDataResult | Add-Member -type NoteProperty -name "File Name" -value $File.Name
        $StorageDataResult | Add-Member -type NoteProperty -name "File Size(KB)" -value $($FileSize/1KB)
        $StorageDataResult | Add-Member -type NoteProperty -name "Versions Size(KB)" -value $($VersionSize/1KB)
        $StorageDataResult | Add-Member -type NoteProperty -name "Total File Size(KB)" -value $($TotalFileSize/1KB)
        $StorageDataResult | Add-Member -type NoteProperty -name "Created on" -value $File.TimeCreated 
        $StorageDataResult | Add-Member -type NoteProperty -name "Last Modified" -value $File.TimeLastModified 
        $StorageDataResult | Add-Member -type NoteProperty -name "Created by" -value $File.Author.Name        
        $StorageDataResult | Add-Member -type NoteProperty -name "Parent Folder" -value $File.ParentFolder.URL
        $StorageDataResult | Add-Member -type NoteProperty -name "URL" -value $File.URL

        $StorageDataCollection += $StorageDataResult
        #Write-Host "Processing File:"$File.Name
    } 
        #Get Files in Sub Folders
        foreach ($SubFolder in $Folder.SubFolders)
        {   
         if($SubFolder.Name -ne "Forms") #Leave "Forms" Folder which has List default Aspx Pages.
             {
                GetLibraryStorageRpt($SubFolder)          
             }
        }   
    return $StorageDataCollection
}

#Input Variables 
$WebURL = "http://sharepoint.crescent.com/sites/operations" 
$ListName ="Documents"

#Get the List
$List = Get-SPWeb $WebURL | Select -ExpandProperty "Lists" | Where-Object{$_.Title -eq $ListName}

#Call the function to get data 
$StorageDetails = GetLibraryStorageRpt($List.RootFolder)

write-host "Total Number of Files:" $List.ItemCount 
write-host "Library Created by:" $List.Author

#Calculate the Total Size
$TotalSize = ($StorageDetails | Measure-Object 'Total File Size(KB)' -Sum | Select -expand Sum)  
Write-host "Library Size in MB: "([Math]::Round( ($TotalSize/1024),2))

#Export the data to CSV File
$StorageDetails | sort-object "Total File Size" -descending | Export-csv "$($ListName)_LibraryStroageRpt.csv" -notypeinformation
Write-Host "Storage Report has been Generated!"

If you want to generate an inventory report for all documents in a site collection, use: Get Documents Inventory for a Site Collection using PowerShell

Salaudeen Rajack

Salaudeen Rajack is a SharePoint Architect with Two decades of SharePoint Experience. He loves sharing his knowledge and experiences with the SharePoint community, through his real-world articles!

9 thoughts on “Get SharePoint Documents Inventory Report with PowerShell

  • October 19, 2020 at 5:56 PM

    Hi Salaudeen

    Could you help me with a new requirement. I got the report for each of the file in a library but now how do I get a report of the size of each of the folders in a library?

    Thanks

    Reply
  • September 3, 2020 at 3:20 AM

    Hi Salaudeen

    Another question please. how do I use this script for the top site and all sub sites under it to call the Function to retrieve detailed Library storage Report for each site.

    Thanks

    Reply
  • September 3, 2020 at 3:14 AM

    Thanks so much. My mistake. should have see that. It work great now on MOSS 2007. Thanks again.

    Reply
  • September 1, 2020 at 6:20 AM

    Hi
    I tried to run this script on MOSS 2007 by adding
    [System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.SharePoint”) >null

    And changing this line but got the error. Could you help me resolve the error or i need to find some other property to use.

    $List = $WebURL | Select -ExpandProperty “Lists” | Where-Object{$_.Title -eq $ListName}
    Select-Object : Property “Lists” cannot be found.

    Thanks

    Reply
    • September 1, 2020 at 11:51 PM

      Hi Salaudeen
      sorry for being such a novice. here my PS

      [System.Reflection.Assembly]::LoadWithPartialName(“Microsoft.SharePoint”) >null
      $url = “http://mosssp/sites/TestbySPAdmin”
      $ListName = “DocumentLibrary”
      Function global:Get-SPWeb($url)
      {
      $site= New-Object Microsoft.SharePoint.SPSite($url)
      if($site -ne $null)
      {
      $web=$site.OpenWeb();
      }
      return $web
      }
      $Web = Get-SPWeb($url)
      $List = $Web.Lists($ListName)

      but i got the error
      Method invocation failed because [Microsoft.SharePoint.SPWeb] doesn’t contain a method named ‘Lists’.
      At line:16 char:19

      Thanks

      Reply
    • September 2, 2020 at 5:45 PM

      The Line: $List = $Web.Lists($ListName) should be “$List = $Web.Lists[$ListName]”

      Reply

Leave a Reply