2011-09-29 9 views
6

Jak można anulować wszystkie działające przepływy pracy na liście programu SharePoint (2010)?Anulowanie wielu przepływów pracy SharePoint przy użyciu PowerShell

Znalazłem ten skrypt przez technet.

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

KOD:

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

Wielkie dzięki za pomoc.

Odpowiedz

11

Daj temu strzał.

Zmodyfikowałem tak, aby zostało wykonane na określonej liście w określonej sieci.

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

Pracowałem dla mnie dobrze. Daj mi znać, czy to działa dla Ciebie.

+0

Rzeczywiście jest bardzo przydatny !!! Ja się teraz cieszę;) THX – DaviideSnow

+0

Dobra oferta. Cieszę się, że to dla ciebie zadziałało. –

0

Spróbuj (proste "tłumaczenie" z C# do 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

Hej Pedro, wielkie dzięki za pomoc! Twoja odpowiedź była dla mnie bardzo przydatna. Zmieniłem skrypt tak, aby działał tylko podsieci. Skrypt już działa, anulując obieg pracy, ale pozostaje jeszcze jeden problem. Otrzymuję komunikat "Błąd wyliczenia". Jak rozwiązać ten problem. Okazało się, że jest to problem z tablicą podczas zmieniania SharePoint-Web. – DaviideSnow

+0

Czy możesz opublikować "ślad stosu" powłoki Power Shell i/lub zmodyfikowaną wersję skryptu? Czy jesteś pewien, że użytkownik, który uruchamia ten skrypt powershell, ma uprawnienia do wyliczania i uzyskiwania dostępu do wszystkich stron internetowych lub twojego SPSite? –

0

tutaj jest mój zmodyfikowany skrypt:

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

to błąd pojawia się (używam german zlokalizowana wersja serwera i 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 

użytkownik uruchamia skrypt jest admin na komputerze jest s elf, administrator sitecollection i sql-admin. Stworzyłem także podwitrynę na tym koncie, więc nie sądzę, aby problem dotyczył użytkowników.

Znalazłem tę odpowiedź (Differences Between PowerShell and C# when Enumerating a Collection), ale nie mam pojęcia, jak używać tej informacji dla mnie ?!

2

Ten skrypt był dla mnie bardzo użyteczny. Robię modyfikacji pozwala mi anulować wszystkie przepływy pracy w jednej listy lub tylko jeden obieg i myślałem, że to tutaj też:

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