SharePoint Online: Terminate Workflow using PowerShell

Requirement: Stop workflow in SharePoint Online using PowerShell

Terminate Workflow in SharePoint Online using PowerShell

SharePoint Online: PowerShell to Cancel Workflow

Let’s terminate all workflow instances of a specific workflow in all items of a list using PowerShell.

#Load SharePoint CSOM Assemblies
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"
Add-Type -Path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.WorkflowServices.dll"
 
#Set Parameters
$SiteURL="https://crescent.sharepoint.com"
$ListName ="Project Tasks"
$WorkflowName ="Send Email"
 
#Get Credentials to connect
$Cred= Get-Credential
 
Try{
    #Setup the context
    $Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($SiteURL)
    $Ctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Cred.Username, $Cred.Password)
     
    #Get the Web, List Objects
    $Web = $Ctx.Web
    $Ctx.Load($Web)
    $List = $Web.Lists.GetByTitle($ListName)
    $Ctx.Load($List)
    $Ctx.ExecuteQuery()
 
    #Initialize Workflow Manager and other related objects
    $WorkflowServicesManager = New-Object Microsoft.SharePoint.Client.WorkflowServices.WorkflowServicesManager($Ctx, $Web)
    $WorkflowSubscriptionService = $workflowServicesManager.GetWorkflowSubscriptionService()
    $WorkflowInstanceService = $WorkflowServicesManager.GetWorkflowInstanceService() 
    $WorkflowAssociations = $WorkflowSubscriptionService.EnumerateSubscriptionsByList($List.Id)
    $Ctx.Load($WorkflowAssociations)
    $Ctx.ExecuteQuery()
 
    #Get the Target workflow to Terminate
    $WorkflowAssociation = $WorkflowAssociations | Where {$_.Name -eq $WorkflowName}
   
    #Prepare the query
    $Query = New-Object Microsoft.SharePoint.Client.CamlQuery
    $Query.ViewXml = "@
    <View Scope='RecursiveAll'>
        <Query>
            <OrderBy><FieldRef Name='ID' Ascending='TRUE'/></OrderBy>
        </Query>
        <RowLimit Paged='TRUE'>2000</RowLimit>
    </View>"
  
    $Counter=1
    #Batch Process items: sharepoint online powershell bulk check in 
    Do {
        $ListItems = $List.GetItems($Query)
        $Ctx.Load($ListItems)
        $Ctx.ExecuteQuery()  
        $Query.ListItemCollectionPosition = $ListItems.ListItemCollectionPosition

        #Loop through each List Item
        ForEach($ListItem in $ListItems)
        {
            #Display a Progress bar
            Write-Progress -Activity "Processing List Items" -Status "Processing Item '$($ListItem.FieldValues.FileRef)' ($Counter of $($List.ItemCount))" -PercentComplete (($Counter / $List.ItemCount) * 100) 

            #Get Workflow Instances of the List Item            
            $WorkflowInstanceCollection = $WorkflowInstanceService.EnumerateInstancesForListItem($List.Id, $ListItem.Id) 
            $Ctx.Load($WorkflowInstanceCollection)
            $Ctx.ExecuteQuery()
         
            #Filter All Workflows Instances of the target workflow where Status is: Started or Canceled or Suspended
            $WorkflowInstancesToKill = $WorkflowInstanceCollection | Where { ($_.Status -eq "Started" -or $_.Status -eq "Canceled" -or $_.Status -eq "Suspended") `
                                                                     -and $_.WorkflowSubscriptionId -eq $WorkflowAssociation.Id}
         
            #Terminate Workflow Instances
            ForEach ($WorkflowInstance in $WorkflowInstancesToKill) 
            { 
                Try{
                    $WorkflowInstanceService.TerminateWorkflow($WorkflowInstance)
                    #To Cancel workflow, use: $WorkflowInstanceService.CancelWorkflow($WorkflowInstance)
                    $Ctx.ExecuteQuery()
                    Write-host -f Green "Worfklow Terminated on List Item:" $ListItem.Id
                } Catch {
                    Write-host "Error terminating workflow on " $ListItem.Id " Error Details: $_"
                }
            }
            $Counter++
        }
    }While($Query.ListItemCollectionPosition -ne $Null)
}
Catch {
Write-host -f Red "Error:" $_.Exception.Message
}

Salaudeen Rajack

Salaudeen Rajack is a SharePoint Architect with Two decades of SharePoint Experience. He loves sharing his knowledge and experiences with the SharePoint community, through his real-world articles!

3 thoughts on “SharePoint Online: Terminate Workflow using PowerShell

  • Hi, I used this workflow to resume a suspended workflow, but I’m hitting a view threshold error, can you please show how to get around the error?

    Reply

Leave a Reply