2011-09-29 23 views
6

Bir SharePoint (2010) Listesindeki tüm çalışan iş akışlarını iptal etmek nasıl mümkündür?PowerShell kullanarak birden çok SharePoint İş Akışı İptal Et

Bu betiği technet ile buldum.

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

KODU: Yardımlarınız için

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

çok teşekkürler.

cevap

11

Bunu bir dene.

Belirli bir web'deki belirli bir listede yapılacak şekilde değiştirdim.

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

Sadece benim için iyi çalıştı. İşe yarıyorsa haber ver.

+0

Gerçekten de çok yararlı! Şimdi mutluyum;) THX – DaviideSnow

+0

İyi anlaşma. Senin için çalıştığına sevindim. –

0

bu (powershell için C# basit "çeviri") deneyin:

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

bir şudur i almak hatası (i Alman kullanıyorum:

burada
$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, çok teşekkürler yardımınız için! Cevabınız benim için çok yararlı oldu. Komut dosyasını yalnızca alt web siteleriyle çalışacak şekilde değiştirdim. Komut dosyası zaten iş akışlarını iptal etmeye çalışır, ancak bir sorun kalmıştır. Bir "Numaralandırma hatası" alıyorum. Bunu nasıl çözebilirim? SharePoint-Web'i değiştirirken bunun bir dizi problem olduğunu öğrendim. – DaviideSnow

+0

powershell "yığın izi" ve/veya komut dosyasının değiştirilmiş sürümünü gönderebilir misiniz? Bu powershell komut dosyasını çalıştıran kullanıcının, tüm ağları veya SPSite numaralarınızı sıralamak ve bunlara erişmek için ayrıcalıklarına sahip olduğundan emin misiniz? –

0

benim değiştirilmiş script sunucu ve sharepoint) yerelleştirilmiş versiyonu:

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 

senaryoyu runnig kullanıcı bu s makinede yönetici konumunda elf, sitecollection yöneticisi ve sql-admin. Ayrıca bu hesapla alt siteyi oluşturdum, bu yüzden sorunların sorun olacağını düşünmüyorum.

Bu cevabı buldum (Differences Between PowerShell and C# when Enumerating a Collection) ama bu bilgiyi benim için nasıl kullanacağım hakkında bir fikrim yok!

2

Bu betik benim için çok kullanışlıdır. Bana tek bir listede iş akışları ya da sadece tek bir iş akışı iptal etmek izin vermek için bir değişiklik yapmak ve burada da bunu sonrası düşündüm:

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