miércoles, 22 de febrero de 2012

Script de Power Shell de SharePoint 2010 para eliminar los elementos de una lista mayor a 60 días de antigüedad

Problema:

Hay una lista que constantemente crece debido a que guarda los usuarios que ha visitado el portal y es necesario depurar esta lista luego de 60 días de caducidad.  La lista actualmente esta en más de 50,000 elementos y debería de mantenerse alrededor de 7,000 elementos como máximo.

Solución:

Utilizar Power Shell para crear un script que realice esta tarea.  El Script consta de 4 Partes que a continuación describo:

1) Cargar en memoria la biblioteca de clases de SharePoint para poder ejecutar el script desde una tarea de Windows.

[void][System.reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")

2) Obtener el listado de elementos a eliminar.  Esto lo hacemos por medio del lenguaje de consultas de SharePoint llamado CAML.

$site    =     new-object Microsoft.SharePoint.SPSite("Dirección url de mi colección de sitios")                                                       
$web     =    $site.rootweb                                                                                               
$list    =    $web.Lists["Nombre de la lista"]                                                                             
$DeleteBeforeDate = [Microsoft.SharePoint.Utilities.SPUtility]::CreateISO8601DateTimeFromSystemDateTime([DateTime]::Now.AddDays(-60))
$caml='
   <Where>
      <Lt>
         <FieldRef Name="CampoFechaAComparar" />
         <Value Type="DateTime">{0}</Value>
      </Lt>
   </Where>
' -f $DeleteBeforeDate
$query=new-object Microsoft.SharePoint.SPQuery
$query.Query=$caml

$col=$list.GetItems($query)

3) Copiar los Id’s de los elementos selccionados a un arreglo para evitar el error “Collection was modified; enumeration operation may not execute”

$items = New-Object System.Collections.ArrayList
#Obtiene los elementos a eliminar (No los elimina de una sola vez para evitar el error de elementos perdidos dentro del loop)
$col |  % {
$items.add($_.id)
}

4) Se eliminado los elementos de la lista por su ID.

# Procede a desplegar los elementos a borrar
$contador = 0
Foreach($item in $items)
{
$contador ++
$detalle = "No.: "+$contador+" |Id: "+$item
write-host $detalle
$col.DeleteItemById($item)
}
$mensaje = "total de elementos eliminados: "+$contador
write-host $mensaje
$web.Dispose()
$site.Dispose()  

Abajo todo el código.

image

Parte de la solución fue extraída del siguiente sitio:

http://blogs.flexnetconsult.co.uk/colinbyrne/2008/02/26/PowerShellSharePointThreeWaysToDeleteAListItemIDCAMLStringMatching.aspx

Mejoras:

En cuando a desempeño el realizar la operación DeleteItemById() demora 10 a 15 segundos en realizarla así que 40,000 elementos demorará aproximadamente 11 horas que no es muy eficiente, pero será solo una vez ya que no se permitirá luego crecer la lista con demasiados elementos para eliminar.

SharePoint4Fun,

Juan Manuel Herrera O.

No hay comentarios.: