SharePoint Online: Terminate Workflow using PowerShell
Requirement: Stop 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
}
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!