Download files from SharePoint Online document library using PowerShell: Here in this post, I will show how we can download files or documents from SharePoint Online document library using PowerShell CSOM script programmatically from the given date by passing the “From Date” and “To Date” to the query.
Download files from SharePoint document library (download all files from SharePoint)- Use Case
Let’s say we want to download certain files from the SharePoint document library that were created between these two dates – using this script we can download those files.
Here in the below screenshot, we can see the file creation date is from September 6 to till date (November 6). Using the code I will download the files that were created from October 28 to November 6 where I will ensure that the file which was created on September 6 will not be downloaded.
PowerShell CSOM Script to Download the files: Download files from SharePoint document library using PowerShell
Using the below PowerShell script we can download all files from the SharePoint document library from the given “From” to “To” date:
#Load SharePoint CSOM Assemblies #Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll" #Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll" cls $fileName = "File_Downloading_Report" #'yyyyMMddhhmm yyyyMMdd $enddate = (Get-Date).tostring("yyyyMMddhhmmss") #$filename = $enddate + '_VMReport.doc' $logFileName = $fileName +"_"+ $enddate+"_Log.txt" $invocation = (Get-Variable MyInvocation).Value $directoryPath = Split-Path $invocation.MyCommand.Path $directoryPathForLog=$directoryPath+"\"+"LogFiles" if(!(Test-Path -path $directoryPathForLog)) { New-Item -ItemType directory -Path $directoryPathForLog #Write-Host "Please Provide Proper Log Path" -ForegroundColor Red } #$logPath = $directoryPath + "\" + $logFileName $logPath = $directoryPathForLog + "\" + $logFileName $isLogFileCreated = $False #DLL location $directoryPathForDLL=$directoryPath+"\"+"Dependency Files" if(!(Test-Path -path $directoryPathForDLL)) { New-Item -ItemType directory -Path $directoryPathForDLL #Write-Host "Please Provide Proper Log Path" -ForegroundColor Red } #DLL location $clientDLL=$directoryPathForDLL+"\"+"Microsoft.SharePoint.Client.dll" $clientDLLRuntime=$directoryPathForDLL+"\"+"Microsoft.SharePoint.Client.dll" Add-Type -Path $clientDLL Add-Type -Path $clientDLLRuntime #File Download location $directoryPathForFileDownloadLocation=$directoryPath+"\"+"Downloaded Files" if(!(Test-Path -path $directoryPathForFileDownloadLocation)) { New-Item -ItemType directory -Path $directoryPathForFileDownloadLocation #Write-Host "Please Provide Proper Log Path" -ForegroundColor Red } #File Download location function Write-Log([string]$logMsg) { if(!$isLogFileCreated){ Write-Host "Creating Log File..." if(!(Test-Path -path $directoryPath)) { Write-Host "Please Provide Proper Log Path" -ForegroundColor Red } else { $script:isLogFileCreated = $True Write-Host "Log File ($logFileName) Created..." [string]$logMessage = [System.String]::Format("[$(Get-Date)] - {0}", $logMsg) Add-Content -Path $logPath -Value $logMessage } } else { [string]$logMessage = [System.String]::Format("[$(Get-Date)] - {0}", $logMsg) Add-Content -Path $logPath -Value $logMessage } } #The below function will download the file from SharePoint Online library. Function FileDownLoadFromSPOnlineLibrary() { param ( [Parameter(Mandatory=$true)] [string] $SPOSiteURL, [Parameter(Mandatory=$true)] [string] $SourceFilePath, [Parameter(Mandatory=$true)] [string] $TargetFilePath, [Parameter(Mandatory=$true)] [string] $UserName, [Parameter(Mandatory=$true)] [string] $Password ) Try { $securePassword= $Password | ConvertTo-SecureString -AsPlainText -Force #Setup the Context $ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SPOSiteURL) $ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($UserName, $securePassword) #Downloading the file from SharePoint online document libray. $fileInfo = [Microsoft.SharePoint.Client.File]::OpenBinaryDirect($ctx,$SourceFilePath) $writeStream = [System.IO.File]::Open($TargetFilePath,[System.IO.FileMode]::Create) $fileInfo.Stream.CopyTo($writeStream) $writeStream.Close() Write-host -f Green "File '$SourceFilePath' has been downloaded to '$TargetFilePath' successfully!" } Catch { $ErrorMessage = $_.Exception.Message +"in Downloading File!: " +$SourceFilePath Write-Host $ErrorMessage -BackgroundColor Red Write-Log $ErrorMessage } } #Parameters value $siteURL="https://globalsharepoint.sharepoint.com/sites/TestSite/" $listName="Documents" #Document library name $fromDate="2019-10-28" $toDate="2019-11-09" $downloadLocation=$directoryPathForFileDownloadLocation; $userName = "YourSPOAccount@YourTenantDomain.com" $password = "YourPassWord" $securePassword= $password | ConvertTo-SecureString -AsPlainText -Force #$batchSize =1000 #Parameters ends here. #Setup the Context $ctx = New-Object Microsoft.SharePoint.Client.ClientContext($siteURL) $ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($userName, $securePassword) #Get the List $list = $ctx.Web.Lists.GetByTitle($listName) $ctx.Load($list) $ctx.ExecuteQuery() $emptyString = "" #Define CAML Query to get Files from the list in batches $Query = New-Object Microsoft.SharePoint.Client.CamlQuery #Here in the below two line "T13:35:58Z" and "T13:36:34Z" are hard coded static value - because while we construct this camel query thru the camel query builder these values gets appended to the date value, so we need this. $startDateVar=$fromDate+"T13:35:58Z" $endDateVar=$toDate+"T13:36:34Z" #Here in the below two line "T13:35:58Z" and "T13:36:34Z" are hard coded static value - ends here. #RecursiveAll $Query.ViewXml = "@ <View Scope='RecursiveAll'> <Query> <Where> <And> <Geq> <FieldRef Name='Created' /> <Value IncludeTimeValue='TRUE' Type='DateTime'>$startDateVar</Value> </Geq> <Leq> <FieldRef Name='Created' /> <Value IncludeTimeValue='TRUE' Type='DateTime'>$endDateVar</Value> </Leq> </And> </Where> </Query> </View>" $count =0 #Get List Items in Batches Do { $ListItems = $List.GetItems($Query) $Ctx.Load($ListItems) $Ctx.ExecuteQuery() $ListItems.Count #Update Postion of the ListItemCollectionPosition $Query.ListItemCollectionPosition = $ListItems.ListItemCollectionPosition $Query.ListItemCollectionPosition If ($ListItems.Count -eq 0) { Break } $downloadItemCount=1; #Extract the each list item from the List Items collection. ForEach($Item in $ListItems) { #Example to Item metadata - this can be used if we want to download based on some item metadata condition. #$documentStatus=$Item["documentStatusColumnName"] try { $Ctx.Load($Item.File) $Ctx.ExecuteQuery() #$eTagVal=$Item.File.ETag #https://globalsharepoint.sharepoint.com/sites/TestSite/Shared%20Documents/LegalDoc.docx $SourceFile=$Item.File.ServerRelativeUrl; #$TargetFile="C:\PowerShell\DownLoadFilesFromSPOnline\Downloaded Files\LegalDoc.docx" $TargetFile=$downloadLocation+"\"+$Item.File.Name; #If we want to download the specific file type we can check the file type using the below code #if($SourceFile.Contains(".zip")){} #Calling the function "FileDownLoadFromSPOnlineLibrary"to download file FileDownLoadFromSPOnlineLibrary -SPOSiteURL $SiteURL -SourceFilePath $SourceFile -TargetFilePath $TargetFile -UserName $UserName -Password $Password $fileDownloadingMessage=$downloadItemCount.ToString()+": "+$Item.File.Name; Write-Host $fileDownloadingMessage -BackgroundColor DarkGreen Write-Log $fileDownloadingMessage $downloadItemCount++ } catch { $ErrorMessage = $_.Exception.Message +"in: " +$Item.File.Name Write-Host $ErrorMessage -BackgroundColor Red Write-Log $ErrorMessage } } Write-Host "=============================================================" Write-Host $count Write-Host "=============================================================" }While ($Query.ListItemCollectionPosition -ne $null)
The file will be downloaded here – just ensure before executing the script this folder is empty.
Execute the above script successfully (download files from SharePoint using PowerShell)
Execute download files from SharePoint using PowerShell script successfully.
Verify the “Downloaded Files” folder – now we can see four files just have arrived (download files from SharePoint document library using PowerShell)
Note:
- In the above location, the file which was created before October 28 is not downloaded because we have given filter criteria from October 28 to November 6.
Prerequisites to execute this script (download files from SharePoint document library using PowerShell)
Need to place the below two DLLs in your script directory “Dependency Files” folder as below:
Change the value of the variable in the variables section like below (download files from SharePoint)
#Variables region $siteURL="Site URL" $listName="Document Library Name" #Document library name $fromDate="From Date(YYYY-MM-DD)" $toDate="To Date(YYYY-MM-DD)" $userName = "YourSPOAccount@YourTenantDomain.com" $password = "YourPassWord" #Variables region ends here
Summary: Download files from a document library using PowerShell (download files from SharePoint)
Thus, in this article we have learned the below:
- How to download a file/document from SharePoint online document library using PowerShell CSOM.
- How to download a file/document from the SharePoint folder using PowerShell.
See Also: SharePoint Online PowerShell
You may also like the below SharePoint Online PowerShell tutorials:
- Get hub sites and associated sites using PnP PowerShell
- SharePoint Online Automation – O365 – Upload files to document library using PowerShell CSOM
- SharePoint Online Automation – O365 – Create multiple items in a list using PowerShell CSOM
- SharePoint Online: Delete All Files from document library for the given date – PowerShell CSOM
- SharePoint Automation: PowerShell script to get remote server information
- SharePoint Online Automation – O365 – Send email from SharePoint online Using CSOM PowerShell script
- SharePoint Online Automation – O365 – Update document library metadata using PowerShell CSOM
- Office 365: Getting started with SharePoint PnP PowerShell – installation
- In 2 steps convert a classic SharePoint page to modern using PnP
- Office 365: Retrieve hub sites and associated sites using PnP Powershell
- Create a modern team site using PnP PowerShell in SharePoint
- In 4 steps access SharePoint online data using postman tool
- SharePoint admin center: Learn SharePoint online administration in an hour – step by step
- SharePoint REST API: GET vs POST vs PUT vs DELETE vs PATCH
- Office 365: Understanding the hub site in SharePoint online
- Introduction to SharePoint information architecture
