Download All Files in a SharePoint Document Library using PowerShell

Requirement: Download all files in a SharePoint document library.

 Download All Files in a SharePoint Document Library using PowerShell

How to download all files from a document library?

A SharePoint document library is a central location where all files related to a project or team can be stored and accessed. Often, users may need to download all the files in a SharePoint document library to their local system for backup or analysis purposes. While SharePoint provides the option to download individual files, it can be time-consuming to download all files one-by-one. Fortunately, PowerShell can be used to download all the files in a SharePoint document library with just a few lines of code.

To download all files in a SharePoint document library, you can follow these steps:

  1. Open the document library in SharePoint that you want to download all files from.
  2. Click on the checkbox in the header of the leftmost column to select all files in the library. If there are multiple pages of files in the library, you may need to repeat this step on each page to select all files.
  3. Click on the “Download” button in the toolbar at the top of the page.

This downloads all selected files and folders from the Document Library. You can also use the “Open in Explorer” option to open the document library in Windows File explore and copy-paste the files to your local disk.

Download All Documents in a Library using PowerShell:

Looking to download all the files from a SharePoint document library quickly? Whether you need to archive documents or just want a local copy of everything in the library, this guide will show you how to download all documents from a document library using PowerShell.

Here is the PowerShell to download all files in a document library. 

Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue

#Function to Download All Files from a SharePoint Folder
Function Download-SPFolder($SPFolderURL, $DownloadPath)
{
    Try {
        #Get the Source SharePoint Folder
        $SPFolder = $web.GetFolder($SPFolderURL)
 
        $DownloadPath = Join-Path $DownloadPath $SPFolder.Name 
        #Ensure the destination local folder exists! 
        If (!(Test-Path -path $DownloadPath))
        {    
            #If it doesn't exists, Create
            $LocalFolder = New-Item $DownloadPath -type directory 
        }
 
        #Loop through each file in the folder and download it to Destination
        ForEach ($File in $SPFolder.Files) 
        {
            #Download the file
            $Data = $File.OpenBinary()
            $FilePath= Join-Path $DownloadPath $File.Name
            [System.IO.File]::WriteAllBytes($FilePath, $data)
            Write-host -f Green "`tDownloaded the File:"$File.ServerRelativeURL         
        }
 
        #Process the Sub Folders & Recursively call the function
        ForEach ($SubFolder in $SPFolder.SubFolders)
        {
            If($SubFolder.Name -ne "Forms") #Leave "Forms" Folder
            {
                #Call the function Recursively
                Download-SPFolder $SubFolder $DownloadPath
            }
        }
    }
    Catch {
        Write-host -f Red "Error Downloading Document Library:" $_.Exception.Message
    }  
}

#Main Function
Function Download-SPDocumentLibrary($SiteURL, $LibraryName, $DownloadPath)
{
    Try {
        #Get the  Web
        $Web = Get-SPWeb $SiteURL

        #Delete any existing files and folders in the download location
        If (Test-Path $DownloadPath) {Get-ChildItem -Path $DownloadPath -Recurse| ForEach-object {Remove-item -Recurse -path $_.FullName }}

        #Get the document Library to Download
        $Library = $Web.Lists[$LibraryName]
        Write-host -f magenta "Downloading Document Library:" $Library.Title

         #Call the function to download the document library
        Download-SPFolder -SPFolderURL $Library.RootFolder.Url -DownloadPath $DownloadPath

        Write-host -f Green "*** Download Completed  ***"
    }
    Catch {
        Write-host -f Red "Error Downloading Document Library:" $_.Exception.Message
    }  
}

#Runtime-Variables
$SiteURL = "https://Intranet.crescent.com/sites/marketing"
$LibraryName ="Shared Documents"
$DownloadPath ="C:\Downloads\SP2010"

#Call the Function to export all document libraries from a site
Download-SPDocumentLibrary $SiteURL $LibraryName $DownloadPath

Download All Document Libraries from a SharePoint Site:

How about downloading all files from all document libraries from a SharePoint site?

Add-PSSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue

#Function to Download All Files from a SharePoint Folder
Function Download-SPFolder($SPFolderURL, $LocalFolderPath)
{
    Try {
        #Get the Source SharePoint Folder
        $SPFolder = $global:web.GetFolder($SPFolderURL)
 
        $LocalFolderPath = Join-Path $LocalFolderPath $SPFolder.Name 
        #Ensure the destination local folder exists! 
        If (!(Test-Path -path $LocalFolderPath))
        {    
            #If it doesn't exists, Create
            $LocalFolder = New-Item $LocalFolderPath -type directory 
        }
 
        #Loop through each file in the folder and download it to Destination
        ForEach ($File in $SPFolder.Files) 
        {
            #Download the file
            $Data = $File.OpenBinary()
            $FilePath= Join-Path $LocalFolderPath $File.Name
            [System.IO.File]::WriteAllBytes($FilePath, $data)
            Write-host -f Green "`tDownloaded File:"$File.ServerRelativeURL
        }
 
        #Process the Sub Folders & Recursively call the function
        ForEach ($SubFolder in $SPFolder.SubFolders)
        {
            If($SubFolder.Name -ne "Forms") #Leave "Forms" Folder
            {
                #Call the function Recursively
                Download-SPFolder $SubFolder $LocalFolderPath
            }
        }
    }
    Catch {
        Write-host -f Red "Error Downloading Document Library:" $_.Exception.Message
    }  
}

#Main Function
Function Export-SPLibraries()
{
    Try {
        #Get the Source Web
        $global:Web = Get-SPWeb $global:SourceSiteURL

        #Delete any existing files and folders in the download location
        If (Test-Path $global:LocalFolderPath) {Get-ChildItem -Path $global:LocalFolderPath -Recurse| ForEach-object {Remove-item -Recurse -path $_.FullName }}

        #Array to Skip System Libraries
        $SystemLibraries =@("Pages", "Converted Forms", "Master Page Gallery", "Customized Reports", 
                      "Form Templates", "List Template Gallery", "Theme Gallery", "Reporting Templates", 
                          "Site Collection Documents", "Site Collection Images", "Site Pages", "Solution Gallery", 
                               "Style Library", "Web Part Gallery","Site Assets", "wfpub")

        #Get all document libraries - Exclude Hidden and System Libraries
        $LibraryCollection = $Web.lists | Where-Object  { ($_.BaseType -eq "DocumentLibrary") -and ($_.hidden -eq $false) -and ($SystemLibraries -notcontains $_.Title)}

        #Iterate through each list and export
        ForEach($Library in $LibraryCollection)
        {
            Write-host -f magenta "Downloading Document Library:" $Library.Title

            #Call the function to download the document library
            Download-SPFolder -SPFolderURL $Library.RootFolder.Url -LocalFolderPath $global:LocalFolderPath
        } 

        Write-host "*** Download Completed  ***"
    }
    Catch {
        Write-host -f Red "Error Downloading Document Library:" $_.Exception.Message
    }  
}

#region Runtime-Variables
$Global:SourceSiteURL = "https://SP2010.crescent.com/sites/marketing"
$Global:LocalFolderPath ="C:\Migration\Downloads"
#endregion Runtime-Variables

#Call the Function to download all document libraries from a site
Export-SPLibraries

To download all files from a SharePoint Online document library, use: SharePoint Online PowerShell to Download a Document library

Salaudeen Rajack

Salaudeen Rajack - SharePoint Expert with Two decades of SharePoint Experience. Love to Share my knowledge and experience with the SharePoint community, through real-time articles!

8 thoughts on “Download All Files in a SharePoint Document Library using PowerShell

  • This was a life-saver!!

    We are finally retiring our old, deprecated Sharepoint 2013 Community (free) on-prem site, and I realized that with the well-deserved demise of Internet Explorer, I had no easy way to retrive the documents from all the various libraries.

    This script nailed it!

    Tip: If you are running Sharepoint On-premise, run this script from your Sharepoint Web Server, as the Powershell modules are already installed.

    Reply
  • Great Stuff! I am new to Sharepoint and powershell.

    I am planning to download specific folder from Shared Documents/Folder1

    I used the first script and it gives me this error:
    “Error Downloading Document Library: The term ‘Get-SPWeb’ is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the
    name, or if a path was included, verify that the path is correct and try again.”

    Should I put my SiteURL under this line?
    Try {
    #Get the Web
    $Web = Get-SPWeb $SiteURL

    Hoping you can give an advise sir.

    Thank you.

    Reply
  • Salaudeen —

    As usual great stuff. I couldn’t begin to guess how many of your scripts/snippets are in my everyday scripts. I have one question with this one. Is there a way for a typical end user with access to a site but no access to the server to download multiple files / folders?

    Reply
    • Explorer view – Mapped network Drives can be used, Instead of PowerShell. Alternatively, You can use CSOM PowerShell from client machines.

      Reply
  • Thank you Very Much for the Script….

    Reply
  • Thank you very much!!!!!

    Reply
  • In SharePoint 2013 I need a way to copy a subset of documents only from a Document Repository to a Temp directory in Explorer, or another SharePoint Library.

    Or it can based upon a range of dates in a modified view. We are filtering based upon a range of dates on a field named “Begin Date” and “End Date” and want to copy over just the documents based upon the filtered view.

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *