I am new on Powershell and I am trying to loop the content of a remote library in order to download all the zip files present inside the sharepoint library. The following working function is involved in the download of one single file. Could you please help
#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"
Function Download-FileFromLibrary()
{
param
(
[Parameter(Mandatory=$true)] [string] $SiteURL,
[Parameter(Mandatory=$true)] [string] $SourceFile,
[Parameter(Mandatory=$true)] [string] $TargetFile
)
Try {
#Setup Credentials to connect
$Cred= Get-Credential
$Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)
#Setup the context
$Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
$Ctx.Credentials = $Credentials
#sharepoint online powershell download file from library
$FileInfo = [Microsoft.SharePoint.Client.File]::OpenBinaryDirect($Ctx,$SourceFile)
$WriteStream = [System.IO.File]::Open($TargetFile,[System.IO.FileMode]::Create)
$FileInfo.Stream.CopyTo($WriteStream)
$WriteStream.Close()
Write-host -f Green "File '$SourceFile' Downloaded to '$TargetFile' Successfully!" $_.Exception.Message
}
Catch {
write-host -f Red "Error Downloading File!" $_.Exception.Message
}
}
#Set parameter values
$SiteURL="xxx"
$SourceFile="xxx"
$TargetFile="xxx"
#Call the function to download file
#Download-FileFromLibrary -SiteURL $SiteURL -SourceFile $SourceFile -TargetFile $TargetFile
Download-FileFromLibrary -SiteURL $SiteURL -SourceFile $SourceFile -TargetFile $TargetFile
Hi here is my complete working code, I have tested this which is working fine.
#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)
#sharepoint online powershell download file from library
$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
$siteURL="https://globalsharepoint.sharepoint.com/sites/TestSite/"
$listName="Documents"
$fromDate="2019-10-28"
$toDate="2019-11-10"
$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 = ""
$BatchSize="1000"
#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.
$Query.ViewXml = "@
<View Scope='Recursive'>
<Query>
<OrderBy><FieldRef Name='ID' Ascending='True'/></OrderBy>
</Query>
<RowLimit>$BatchSize</RowLimit>
</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
#$SiteURL=$SiteURL
#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($SourceFile.Contains(".zip")) **#Checking file type .zip**
{
$count++;
#Call the function 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)
Execute the above code:
Output: all zip files are downloaded to the given location
Note:
Could not upload the image screenshots here, so added the image reference URL.
Reference URL:
The below dll should be kept as below:
The below code is to handle the getting files from folders, sub folders:
$Query2 = New-Object Microsoft.SharePoint.Client.CamlQuery
$Query2.ViewXml = '<View Scope="RecursiveAll"><Query><Where><Eq><FieldRef Name="FSObjType" /><Value Type="Integer">0</Value></Eq></Where><OrderBy><FieldRef Name="ID" /></OrderBy></Query></View>'
$ListItems2 = $list.GetItems($Query2)
$Ctx.Load($ListItems2)
$Ctx.ExecuteQuery()
foreach($Item in $ListItems2)
{
$Ctx.Load($Item.File)
$Ctx.ExecuteQuery()
$SourceFile=$Item.File.ServerRelativeUrl;
$TargetFile=$downloadLocation+"\"+$Item.File.Name;
if($SourceFile.Contains(".zip"))
{
FileDownLoadFromSPOnlineLibrary -SPOSiteURL $SiteURL -SourceFilePath $SourceFile -TargetFilePath $TargetFile -UserName $UserName -Password $Password
}
}
Take a look on this link where you can download directly from folders:
https://www.sharepointdiary.com/2017/07/download-folder-from-sharepoint-online-using-powershell.html
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.