SharePoint Online: Terminate Workflow using PowerShell
Requirement: Stop a 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
}
Hi, thanks for the info. I am looking to grab the list for all suspended workflows, how the script will look like. thanks
This should help: SharePoint Online: Get Workflow Inventory using PowerShell , Check the status “Suspended”
Thanks alot. That was helpful!
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?
Script is updated to handle larger lists and libraries. Try now!
Works! Thank you so much for this!