Han desarrollado un flujo de trabajo con Visual Studio. El flujo de trabajo será utilizado en múltiples sitios dentro de una estructura de sitios específica. Cada sitio de esta estructura contiene una lista a la cual el flujo debe quedar asociado. Son más de trescientos sitios. Muy posiblemente la solución ideal hubiera sido crear un tipo de contenido, agregar el tipo de contenido a la lista y generar una plantilla para crear multiples instancias de ese template en cada uno de los sitios, después construir el workflow contra ese tipo de contenido (workflow reutilizable), desafortunadamente este no es el caso.
Una vez que planteamos el problema a resolver, tal vez lo primero que se les ocurra es invitar a algunos amigos para apoyarles a cambio de unas pizzas, pero créanme, esas reuniones siempre terminan en algún bar.
Una buena solución sería escribir un pequeño script de PowerShell con el que esto se pudiera llevar a cabo de manera automática, de tal manera que el flujo que desarrollaron se asocie con cada una de las listas que se desea, sin tener que hacerlo de forma manual.
A continuación les comparto el código de un script que hace exactamente eso. Recorre los sitios de la estructura y busca la lista a la cual se le asociará el flujo de trabajo. Como siempre recordándoles que el código es proporcionado *as is* y que ustedes deben modificarlo para utilizarlo en sus ambientes.
cls #variables globales Start-SPAssignment –Global #Id del template del flujo de trabajo $workflowTemplateId = new-object -TypeName System.Guid -ArgumentList "b55fa91f-2fdd-47b8-a80b-c58c32c1b2b6"; $site = Get-SPSite -Identity http://sp2010:123/sites/MiSitio #Elimina cualquier asociación del mismo Workflow que pudiera existir en la lista function DeleteAllWorkflowAssociations($list) { $oldAssociations = New-Object "System.Collections.Generic.List``1[System.Guid]" #buscamos las asociaciones viejas del flujo de trabajo, si existen foreach($workflowAssociationItem in $list.WorkflowAssociations) { if($workflowAssociationItem.BaseTemplate.Id.Equals($workflowTemplateId)) { $oldAssociations.Add($workflowAssociationItem.Id) } } if($oldAssociations.Count -gt 0) { foreach($oldAssociationId in $oldAssociations) { Write-Host "Asociacion " $oldAssociationId " eliminada." $list.WorkflowAssociations.Remove($oldAssociationId) } } } #recorremos todos los sitios para buscar las listas en las que se asociará el workflow foreach($web in $site.AllWebs) { #En este caso mi sitio esta en español, por lo que las listas de "Tasks" y "Workflow History" se llaman asi "Tareas" e "Historial del flujo de trabajo" respectivamente $taskList = $web.Lists["Tareas"] #Lista de tareas que utilizara el workflow $historyList=$web.Lists["Historial del flujo de trabajo"] #Workflow History foreach($list in $web.Lists) { #En este caso yo busco las listas que tienen "Docs", esa es la forma de identificar las listas a las que se asociará el workflow, para mi caso en particular if($list.Title.Contains("Docs ")) { #primero borramos cualquier posible asociacion anterior DeleteAllWorkflowAssociations($list) $workflowTemplate = $web.WorkflowTemplates[$workflowTemplateId] $associationName = "WF " + $list.Title + " - v2" #Este es el nombre que tendrá la instancia del workflow en la lista $listAssociation = [Microsoft.SharePoint.Workflow.SPWorkflowAssociation]::CreateListAssociation($workflowTemplate, $associationName, $taskList, $historyList) $listAssociation.AllowManual=$true #Le permite al usuario iniciar el flujo $listAssociation = $list.WorkflowAssociations.Add($listAssociation) Write-Host "Se creo satisfactoriamente la asociacion " $associationName Write-Host } } } Stop-SPAssignment –Global
Happy scripting!
0 comentarios:
Publicar un comentario