Скрипт который позволяет выкачать все вложения и разложить и по соответствующим папкам.

Posted: 30.11.2022 in Powershell, SharePoint
Метки:, ,

0-2022-11-30_205613    1-2022-11-30_205206

Результат:

2-2022-11-30_205533

Скрипт пробегается по всем записям начиная с меньшего 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
Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s