2011-09-29 22 views
6

Come è possibile annullare tutti i flussi di lavoro in esecuzione in un elenco di SharePoint (2010)?Annulla più flussi di lavoro di SharePoint utilizzando PowerShell

Ho trovato questo script via technet.

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

CODICE:

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(); 
    } 
} 

Molte grazie per il vostro aiuto.

risposta

11

Dare questo uno colpo.

L'ho modificato in modo che venga eseguito su un elenco specifico su una rete specifica.

#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(); 

funzionato bene per me. Fammi sapere se funziona per te.

+0

In effetti è molto utile !!! Io sono felice ora;) THX – DaviideSnow

+0

Buon affare. Sono contento che abbia funzionato per te. –

0

Prova questo ("traduzione" semplice di C# per 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

Hey Pedro, molte grazie per il vostro aiuto! La tua risposta mi è stata molto utile. Ho cambiato lo script per eseguire solo i Web secondari. Lo Script funziona già cancellando i flussi di lavoro, ma rimane un problema. Ottengo un "errore di enumerazione". Come posso risolvere questo. Ho scoperto che questo è un problema di array durante la modifica di SharePoint Web. – DaviideSnow

+0

puoi pubblicare il PowerShell "stack trace" e/o la versione modificata dello script? Sei sicuro che l'utente che sta eseguendo lo script di PowerShell abbia i privilegi per enumerare e accedere a tutti i Web o al tuo SPSite? –

0

qui è il mio script modificato:

$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 questo è l'errore che ottengo (sto usando un tedesco versione localizzata del server e 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 

l'utente runnig lo script è admin sulla macchina, s elfo, amministratore di sitecollection e sql-admin. Ho anche creato il sito secondario con questo account, quindi non credo che l'utente potrebbe essere il problema.

Ho trovato questa risposta (Differences Between PowerShell and C# when Enumerating a Collection) ma non ho la minima idea di come usare queste informazioni per me ?!

2

Questo script è stato per me molto utile. Faccio una modifica per permettere a me di cancellare tutti i flussi di lavoro in una lista o di un solo flusso di lavoro e ho pensato di postare anche qui:

#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(); 
Problemi correlati