Cela aurait pu se terminer comme ça !
Plus sérieusement, SharePoint offre plusieurs moyen pour supprimer des éléments au sein d'une liste / Bibliothèque. En revanche toutes les méthodes ne sont pas aussi performantes, en particulier la fonction SPList.Items.DeleteById si cette fonction reste facile à utiliser et à mettre en place lors de la suppression d'un ou plusieurs éléments.
Mais lorsqu'il s'agit de supprimer plusieurs milliers d'élément cela va lentement très très lentement (environ 3-4 secondes par fichier sur un environnement de développement) Alors effectuer ce traitement sur un volume plus important va vite devenir problématique.
Heureusement une autre fonction existe et permet d'effectuer des traitements par lot. La méthode SPWeb.ProcessBatchData prend en paramètre une chaîne CAML (Collaborative Application Markup Language) qui contient les commandes, qui se compose d'un élément de Batch et un nombre quelconque d'éléments subordonnés Method qui spécifient chacun une méthode d'appel (RPC) de procédure à distance SharePoint .
La forme la plus simple est la suivante:
<batch>
<method>
<setlist scope="Request">ID_LIST</setlist>
<setvar name="ID">ID_ELEMENT</setvar>
<setvar md="" name="`">COMMANDE</setvar>
</method>
</batch>
Une requête CAML permet de faire un filtre sur les documents à supprimer.
Function purgeSite($params){
$web = get-spweb $params[0]
$list = $web.lists[$params[1]]
try
{
$i=0
$spQuery = New-Object Microsoft.SharePoint.SPQuery
$spQuery.ViewFieldsOnly = $true
$spQuery.Query = "<where><lt><fieldref name="Created"><value type="DateTime"><today offsetdays="2"></today></value></fieldref></lt></where>"
$spQuery.RowLimit = 2000;
$itemCount = 0;
$listId = $list.ID;
do
{
[System.Text.StringBuilder]$batchXml = New-Object "System.Text.StringBuilder";
$batchXml.Append("<batch>");
$command = [System.String]::Format( "<method><setlist scope="Request">{0}</setlist><setvar name="`">{1}</setvar><setvar name="owsfileref">{2}</setvar><setvar md="" name="`">Delete</setvar></method>", $listId, "{0}","{1}" );
$listItems = $list.GetItems($spQuery)
$spQuery.ListItemCollectionPosition = $listItems.ListItemCollectionPosition
$count = $listItems.Count
Write-Host $count
foreach ($item in $listItems)
{
Write-Host -ForegroundColor Green "Delete item "$item.ID
$list.Items.DeleteItemById($item.ID)
if($item -ne $null)
{
$batchXml.Append([System.String]::Format($command, $item.ID.ToString(),$item["FileRef"])) | Out-Null;
}
#break;
}
$batchXml.Append("</batch>");
# $web.ProcessBatchData($batchXml.ToString())
$result = $web.ProcessBatchData($batchXml.ToString())
$web.RecycleBin.DeleteAll()
}
while ($spQuery.ListItemCollectionPosition -ne $null)
}
catch
{
Write-Host -ForegroundColor Red $_.Exception.ToString()
}
}