Привет, вот мой полный рабочий код, я проверил, что работает нормально.
#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)
Ввод файла: ![This is my list of documents in SPO online library](https://i.stack.imgur.com/oj29s.png)
Выполните вышеуказанный код:
https://i0.wp.com/global-sharepoint.com/wp-content/uploads/2019/11/FileDownalod1.png?w=428&h=224&ssl=1
Вывод: все zip-файлы загружаются в указанное место
https://i0.wp.com/global-sharepoint.com/wp-content/uploads/2019/11/FileDownalod2.png?w=648&h=224&ssl=1
Примечание:
ВозможноНе загружайте скриншоты изображения сюда, поэтому добавили URL ссылки на изображение.
Ссылка URL:
https://global -sharepoint.com / 2019/11 /09 / how-to-download-file-from-sharepoint-online-library-library-using-powershell-csom-from-the-date-date /
Нижеприведенная dll должнасохранить следующим образом: ![enter image description here](https://i.stack.imgur.com/fVjbq.png)
Код ниже предназначен для обработки получения файлов из папок, подпапок:
$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
}
}