Результат:
Скрипт пробегается по всем записям начиная с меньшего ID. Мне так и не удалось ‘скормить’ caml-запрос команде Get-PnPListItem, хотя параметр -Query у этой команды раньше там был.
Поэтому добавил маленький блок-настройку на 38-ой строке, где можно добавить своё условие. К примеру: вам нужно выгрузить не все вложения, а только для записей из Москвы или регионов. Тогда можно заменить условие ниже:
$condition = $true
на например что-то такое:
$condition = ($listItem.City -eq «Moscow») -or ($listItem.City -eq «Moscow Region»)
# или к примеру чтобы выгрузить аттачменты только начиная с какого-то элемента/времени:
$condition = ($listItem.ID -gt 7000)
ну и так далее.
Скрипт поддерживает threshold > 5000 и также работает с большими списками.
Код:
$url="https://portal.sharepoint.com/sites/web/"
# здесь может быть diplay name или guid
$listName="Listname"
# кроме системных полей
$includeHiddenField = $False
$includeReadonlyField = $False
# по умолчанию 'C:\Users\Administrator'
$saveDir = (Resolve-path ".\")
function ExportList
{
# все поля кроме системных (возможно какое-то из полей будет удобно использовать в кач-ве названия папки)
$listFields = Get-PnPField -List $listName |? { $_.Hidden -eq $includeHiddenField -AND $_.ReadOnlyField -eq $includeReadonlyField} | Select -ExpandProperty internalname
$count = 0
try
{
md .\$listName -Force
md ".\$($listName)\Attachments" -Force
$listItems=(Get-PnPListItem -List $listName -Fields $listFields -PageSize 1000).FieldValues
foreach($listItem in $listItems)
{
$count = $count+1
Write-Progress -Activity "Exporting" -Status "$($count/$listItems.Count*100)% Complete:" -PercentComplete $($count/$listItems.Count*100)
$listItem.GetEnumerator() | Where-Object { $_.Key -in $listFields }| ForEach-Object{
if($_.Key -eq "Attachments" -And $_.Value -eq "TRUE"){
$condition = $true
#$condition = ($listItem.City -eq "Moscow") -or ($listItem.City -eq "Moscow Region")
#$condition = ($listItem.ID -gt 7000)
if ( $condition )
{
Write-Output "Downloading file.."
# папка в данном примере содержит ID и Title
$path = "$($listItem.ID)" + " - " + "$($listItem["Title"])"
# на практике записи SharePoint содержат спецсимволы или пробелы в конце, которые не позволят создать папку
# частично можно обойти так:
$path = $path -replace "[$([RegEx]::Escape([string][IO.Path]::GetInvalidFileNameChars()))]+"," "
$path = $path.Trim()
Write-Host $path
md ".\$($listName)\Attachments\$($path)" -Force
$item = Get-PnPListItem -List $listName -Id $($listItem.ID)
$attachments = ForEach-Object{Get-PnPProperty -ClientObject $item -Property "AttachmentFiles"}
$attachments | ForEach-Object {
Get-PnPFile -Url $_.ServerRelativeUrl -FileName $_.FileName -Path ".\$($listName)\Attachments\$($path)" -AsFile -Force
}
}
}
}
Write-Host $count
}
}
catch [Exception]
{
$ErrorMessage = $_.Exception.Message
Write-Host "Error: $ErrorMessage" -ForegroundColor Red
}
}
Connect-PnPOnline -Url $Url -UseWebLogin
ExportList
Disconnect-PnPOnline