2011-09-29 6 views
6

Comment est-il possible d'annuler tous les flux de travail en cours d'exécution dans une liste SharePoint (2010)?Annuler plusieurs flux de travail SharePoint à l'aide de PowerShell

J'ai trouvé ce script via technet.

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

CODE:

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

Un grand merci pour votre aide.

Répondre

11

Donnez un coup de feu à celui-ci.

Je l'ai modifié afin qu'il soit fait sur une liste spécifique sur un web spécifique.

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

Travaillé très bien pour moi. Dites-moi si cela marche pour vous.

+0

En effet c'est très utile !!! Moi est heureux maintenant;) THX – DaviideSnow

+0

Bonne affaire. Je suis content que ça a marché pour toi. –

0

Essayez ceci (simple "traduction" de C# à 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, merci beaucoup pour votre aide! Votre réponse m'a été très utile. J'ai changé le script pour seulement courir à travers les sous-sites Web. Le script fonctionne déjà en annulant les workflows, mais il reste un problème. Je reçois une "erreur d'énumération". Comment résoudre ça. J'ai découvert que c'est un problème de tableau en changeant le SharePoint-Web. – DaviideSnow

+0

pouvez-vous poster le powershell "pile trace" et/ou la version modifiée du script? Etes-vous sûr que l'utilisateur qui exécute ce script PowerShell a les privilèges pour énumérer et accéder à tous les sites Web ou à votre SPSite? –

0

ici est mon script modifié:

$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 ceci est l'erreur que je reçois (je suis en utilisant un allemand version localisée du serveur et 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'utilisateur runnig le script est admin sur la machine, il est elf, administrateur de sitecollection et sql-admin. J'ai également créé le sous-site avec ce compte, donc je ne pense pas que useracces serait le problème.

J'ai trouvé cette réponse (Differences Between PowerShell and C# when Enumerating a Collection) mais je n'ai pas la moindre idée de comment utiliser cette information pour moi ?!

2

Ce script a été méchamment utile pour moi. Je fais une modification pour me permettre d'annuler tous les flux de travail dans une liste ou un seul flux de travail et je pensais que je posterais ici aussi:

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