lunes, 7 de enero de 2013

PowerShell. Iniciar flujos en servidor Sharepoint.



En algunas ocasiones nos encontramos que hemos creado un nuevo flujo en una lista o biblioteca y lo queremos ejecutar para todos los elementos (pueden ser muchos) sin tener que ir elemento a elemento para iniciar manualmente.

Para resolver este problema lo podremos automatizar usando powershell. Iniciamos la consola y ejecutamos el siguiente codigo.

#Configuració
 $NomLlistaWF = "Titulo de la lista o biblioteca";
 $NomWorkflow = "Flujo a ejecutar";

en las dos lineas anteriores almacenamos en una variable los nombres de la lista o biblioteca donde tenemos el flujo y el nombre del flujo.

A continuación cargamos el modulo de sharepoint si no lo teniamos previamente cargado

 [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Sharepoint")

Y creamos en variables los objetos para el sitio (indicando la url del servidor), web (indicando url donde esta la lista) y la lista (que tomara el nombre configurado anteriormente). Tenemos que activar las modificaciones en el objeto web con AllowUnsafeUpdates.

 $spsite = new-object Microsoft.SharePoint.SPSite("http://servidor");
 $spweb = $spsite.OpenWeb("/UrlSubWeb");
 $spweb.AllowUnsafeUpdates = $true;  
 $splist = $spweb.Lists[$NomLlistaWF];

A continuación cargamos en una variable el flujo que ejecutaremos para cada elelmento de la lista

# Administrador de Fluxes
 $manager=$spsite.WorkFlowManager
 $association=$splist.WorkFlowAssociations | where {$_.Name -eq $NomWorkflow}
 $association.AllowAsyncManualStart = $true
 $association.AllowManual = $true

Y para cada elemento de la lista iniciamos el flujo. Se ha incluido una espera (Start-Sleep) de 1 segundo por si se trata de listas o bibliotecas muy grandes no ejecutar demasiados flujos simultaneos. Este valor lo podremos ejecutar si son flujos muy grandes que requieren mucho tiempo en ejecutar o en llegar a una actividad de espera (aprovación, cambio de estado,...).

# Iniciar per tots els elements.  
 foreach ($item in $splist.Items) { Start-Sleep -s 1; $data=$association.AssociationData; $wf=$manager.StartWorkFlow($item,$association,$data); }

Una vez finalizado liberamos los objetos web y sitio

# Alliberar objectes 
 $spweb.Dispose(); 
 $spsite.Dispose();

No hay comentarios:

Publicar un comentario