SharePoint Online: Terminate Workflow using PowerShell

Requirement: Stop a workflow in SharePoint Online using PowerShell.

Terminate Workflow in SharePoint Online using PowerShell

SharePoint Online: PowerShell to Cancel Workflow

SharePoint workflows are a powerful tool that allows organizations to automate business processes and improve productivity. However, there may be times when you need to terminate a workflow that is causing issues or is no longer needed. In such cases, PowerShell can be used to terminate the workflow in SharePoint Online. In this article, we will outline the steps to terminate a workflow in SharePoint Online using PowerShell.

Let’s terminate all workflow instances of a specific workflow in all list items 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 - Information Technology Expert with Two-decades of hands-on experience, specializing in SharePoint, PowerShell, Microsoft 365, and related products. He has held various positions including SharePoint Architect, Administrator, Developer and consultant, has helped many organizations to implement and optimize SharePoint solutions. Known for his deep technical expertise, He's passionate about sharing the knowledge and insights to help others, through the real-world articles!

6 thoughts on “SharePoint Online: Terminate Workflow using PowerShell

Leave a Reply

Your email address will not be published. Required fields are marked *