2011-09-29 31 views
6

¿Cómo es posible cancelar todos los flujos de trabajo en ejecución en una lista de SharePoint (2010)?Cancelar varios flujos de trabajo de SharePoint con PowerShell

Encontré este script a través de technet.

http://social.technet.microsoft.com/Forums/en-US/sharepoint2010programming/thread/d3913265-9712-4e61-9e38-1f9b78c8f718/

CÓDIGO:

using (SPSite oSite = new SPSite("<your url>")) 
{ 
    foreach (SPWeb oWeb in oSite.AllWebs) 
    { 
     oWeb.AllowUnsafeUpdates = true; 

     // stop list workflows 
     foreach (SPList list in oWeb.Lists) 
     { 
      foreach (SPListItem oItem in list.Items) 
      { 
       foreach (SPWorkflow workflow in oItem.Workflows) 
       { 
        SPWorkflowManager.CancelWorkflow(workflow); 
       } 
      } 
     } 

     // stop site workflows 
     foreach (SPWorkflow workflow in oWeb.Workflows) 
     { 
      SPWorkflowManager.CancelWorkflow(workflow); 
     } 

     oWeb.AllowUnsafeUpdates = false; 
     oWeb.Dispose(); 
    } 
} 

Muchas gracias por su ayuda.

Respuesta

11

Dale una oportunidad.

Lo modifiqué para que se haga en una lista específica en una web específica.

#Site URL 
$web = Get-SPWeb "http://urlforsite.com"; 
$web.AllowUnsafeUpdates = $true;  

#List Name 
$list = $web.Lists["ListName"]; 

# Iterate through all Items in List and all Workflows on Items.   
foreach ($item in $list.Items) { 
foreach ($wf in $item.Workflows) { 

#Cancel Workflows   
[Microsoft.SharePoint.Workflow.SPWorkflowManager]::CancelWorkflow($wf);  
} 
} 
$web.Dispose(); 

Funcionó bien para mí. Avíseme si funciona para usted.

+0

De hecho, es muy útil !!! Me está feliz ahora;) THX – DaviideSnow

+0

Buen trato. Me alegra que haya funcionado para ti. –

0

Prueba esto ("traducción" simple de C# para PowerShell):

$site = Get-SPSite "<your url>"; 

$site.AllWebs | foreach { 
    $web = $_; 
    $web.AllowUnsafeUpdates = $true; 

    # stop list workflows 
    $web.Lists | foreach { 
    $list = $_; 
    $list.Items | foreach { 
     $item = $_; 
     $item.Workflows | foreach { 
     $wf = $_; 
     [Microsoft.SharePoint.Workflow.SPWorkflowManager]::CancelWorkflow($wf); 
     } 
    } 
    } 

    # stop site workflows 
    $web.Workflows | foreach { 
    $wf = $_; 
    [Microsoft.SharePoint.Workflow.SPWorkflowManager]::CancelWorkflow($wf); 
    }  

    $web.AllowUnsafeUpdates = $false; 
    $web.Dispose(); 
} 

$site.Dispose(); 
+0

Hola Pedro, muchas gracias por su ayuda! Su respuesta fue muy útil para mí. Cambié la secuencia de comandos para que solo se ejecutara a través de subwebs. El script ya funciona cancelando los flujos de trabajo, pero queda un problema. Obtengo un "Error de enumeración". Cómo resuelvo esto. Descubrí que se trata de un problema de matriz al cambiar SharePoint-Web. – DaviideSnow

+0

puede publicar el "rastro de pila" de powershell y/o la versión modificada del guion? ¿Está seguro de que el usuario que está ejecutando ese script de PowerShell tiene privilegios para enumerar y acceder a todas las webs o su SPSite? –

0

aquí es mi script modificado:

$web = Get-SPWeb "http://site/subsite"; 

    $web.allowUnsafeUpdates = 'true'; 

    # stop list workflows 
    $web.Lists | foreach { 
    $list = $_; 
    $list.Items | foreach { 
     $item = $_; 
     $item.Workflows | foreach { 
     $wf = $_; 
     [Microsoft.SharePoint.Workflow.SPWorkflowManager]::CancelWorkflow($wf); 
     } 
    } 
    } 

    $web.allowUnsafeUpdates = 'false'; 
    $web.Dispose(); 

un este es el error que consigo (estoy usando un alemán versión localizada del servidor y SharePoint):

Fehler bei der Enumeration einer Auflistung: Collection was modified; enumeration operation may not execute.. 
Bei C:\stopwf.ps1:7 Zeichen:3 
+ <<<< $web.Lists | foreach { 
    + CategoryInfo   : InvalidOperation: (Microsoft.Share...on+SPEnumerator:SPEnumerator) [], RuntimeException 
    + FullyQualifiedErrorId : BadEnumeration 

el usuario runnig el guión es admin en la máquina que s elf, sitecollection admin y sql-admin. También creé el subsitio con esta cuenta, así que no creo que useracces sea el problema.

Encontré esta respuesta (Differences Between PowerShell and C# when Enumerating a Collection) pero no tengo ni idea de cómo usar esta información para mí?

2

Este script me ha sido perversamente útil. Hago una modificación para permitir que cancele todos los flujos de trabajo en una sola lista o sólo un flujo de trabajo y pensé que iba a publicar aquí también:

#Parameters 
    param($listToCancel,$WfToCancel) 

    #Site URL 
    $web = Get-SPWeb "http://mydomain.com"; 
    $web.AllowUnsafeUpdates = $true;  

    #List Name 
    $list = $web.Lists[$listToCancel]; 

    #Add wildcards to Wf variable 
    $WildcardWfToCancel = "*"+$WfToCancel+"*"; 

    # Iterate through all Items in List and all Workflows on Items.   
    foreach ($item in $list.Items) { 
    foreach ($wf in $item.Workflows) { 

    #Test for workflow complete and match criteria 
    if (($wf.ParentAssociation.InternalName -like $WildcardWfToCancel) -and ($wf.IsCompleted -ne $true))  { 

    #Show status and cancel Workflows 
    write-Host $wf.ItemName -nonewline; 
    write-host "  " -nonewline; 
    write-host $wf.ParentAssociation.InternalName; 
    Write-Host " Status " -nonewline; 
    Write-host $wf.InternalState;  

    [Microsoft.SharePoint.Workflow.SPWorkflowManager]::CancelWorkflow($wf);  
    } 
    } 
    } 
    $web.Dispose(); 
Cuestiones relacionadas