Vues :

Introduction:

Dans cet article, nous mettrons en lumière un script PowerShell spécialement conçu pour sauvegarder des listes SharePoint, même celles avec un volume de données important, facilitant ainsi la gestion des informations dans un contexte de migration ou de sauvegarde.

 

Prérequis:
Avant d'exécuter le script, assurez-vous d'avoir les modules PowerShell nécessaires installés. Le module requis : PnP PowerShell, qui peut être installé via la commande suivante :

PowerShell :

Install-Module PnP.PowerShell -Scope CurrentUser
 
 

Sauvegarder les listes SharePoint:


Le script PowerShell présenté ici est spécialement conçu pour relever le défi de sauvegarder des listes SharePoint comportant un grand nombre de données.

Il démarre en se connectant à l'environnement SharePoint source, puis parcourt toutes les listes, même celles avec un volume de données important. Lorsque le script détecte une liste avec un nombre d'éléments dépassant un seuil, il divise la sauvegarde en lots, optimisant ainsi le processus pour éviter les contraintes liées aux limitations de Add-PnPDataRowsToSiteTemplate.

La flexibilité de ce script réside dans sa capacité à s'adapter aux besoins spécifiques de chaque scénario. En configurant les paramètres appropriés tels que $backupAllDataList, les administrateurs peuvent choisir de sauvegarder toutes les données de listes ou de se concentrer sur la structure des listes.

Le script offre aussi la possibilité de restaurer le modèle du site sauvegardé sur un nouveau site avec le paramètre $restoreSite.

 

$existingTenant = "contoso"
$titleExistingUrl = "sales"
$nameBackupFile = $titleExistingUrl + ".xml"
$backupAllDataList = $true
$restoreSite = $true
$ExistingSiteUrl = "https://$($existingTenant).sharepoint.com/sites/$($titleExistingUrl)"
$SiteTemplateFile = "C:/$($nameBackupFile)"
$BatchSize=2000

$targetTenant = "contoso"
$targetTitleUrl = "side-sales"
$TargetSiteUrl = "https://$($targetTenant).sharepoint.com/sites/$($targetTitleUrl)/"

Connect-PnPOnline -Url $ExistingSiteUrl -PnPManagementShell
Get-PnPSiteTemplate -Out $SiteTemplateFile -Handlers Lists

if($backupAllDataList) {
    $lists = Get-PnPList | Where-Object {$_.RootFolder.ServerRelativeUrl -like "*/Lists/*"}
   
    foreach($list in $lists) {
        write-host "Backing up list $($list.Title)"
        if ($list.ItemCount -gt 0){
            if ($list.ItemCount -le 5000){
                Add-PnPDataRowsToSiteTemplate -Path $SiteTemplateFile -List $list -Query '<View></View>'
            }
            else{
                $loopCount =[math]::ceiling($list.ItemCount/$BatchSize)
                $startCount = 0
                $initialStartCount = 1
                $endCount = $BatchSize
                    for ($count = 0;$count -lt $loopCount;$count++)
                    {If($count -eq $loopCount-1){
                            $templatequery = '<Query><Where><And><Gt><FieldRef Name="ID"></FieldRef><Value Type="Number">' +$startCount + '</Value></Gt><Lt><FieldRef Name="ID"></FieldRef><Value Type="Number">' +$endCount + '</Value></Lt></And></Where></Query>'
                                Add-PnPDataRowsToSiteTemplate -Path $SiteTemplateFile -List $list -Query $templatequery
                        }
                        else{
                            $camlQuery = "<View><Query><Where><And><Gt><FieldRef Name='ID'></FieldRef><Value Type='Number'>$startCount</Value></Gt><Lt><FieldRef Name='ID'></FieldRef><Value Type='Number'>$endCount</Value></Lt></And></Where><View><OrderBy><FieldRef Name='ID' Ascending='True' /></OrderBy></View></Query></View>"
                            $Items = Get-PnPListItem -List $list -Query $camlQuery | Select-Object -Last 1
                            $templatequery = '<Query><Where><And><Gt><FieldRef Name="ID"></FieldRef><Value Type="Number">' +$startCount + '</Value></Gt><Lt><FieldRef Name="ID"></FieldRef><Value Type="Number">' +$endCount + '</Value></Lt></And></Where></Query>'
                            Add-PnPDataRowsToSiteTemplate -Path $SiteTemplateFile -List $list -Query $templatequery
                            $startCount = $initialStartCount + $Items.Id
                            $endCount = $endCount + $BatchSize
                            }
                    }
            }
        }
    }
}

if($restoreSite) {
    # Restore data to the target site
    Connect-PnPOnline -Url $TargetSiteUrl -PnPManagementShell
    Invoke-PnPSiteTemplate -Path $SiteTemplateFile
}

 

Conclusion:
En conclusion, ce script PowerShell émerge comme une solution indispensable pour la sauvegarde de listes SharePoint, même lorsque ces listes contiennent un grand volume de données. Grâce à son approche méthodique basée sur la division en lots, les administrateurs peuvent maintenant gérer efficacement des environnements SharePoint complexes et assurer une continuité des opérations sans compromettre les performances.

N'oubliez pas de vérifier et d'ajuster les paramètres en fonction de vos besoins spécifiques avant d'intégrer ce script dans votre flux de travail SharePoint.