Skip to main content
Added workflow outcome validation
Source Link
Ruslan Dayanov
  • 1.6k
  • 11
  • 17

The problem is in

$workflow | where {$_.InternalState -ne "Completed"}

You are trying to enumerate through $workflow object, wich is not the collection. So as Lance said the good way is to filter workflows:

$badWorkflows = $item.Workflows | Where-Object {($_.InternalState -eq "Running") -and ($_.Created.ToLocalTime().AddHours(4) -lt (Get-Date))}

or scip completed worflows:

foreach ($workflow in $item.Workflows)
{
    if($workflow.IsCompleted -eq $true)
    {
      continue
    }
    #Checkforeach date($task in $workflow.Tasks)
    {
        if($task["WorkflowOutcome"] -eq "Error")
        {
        #stop workflow
        }
    }
    $query=New-Object -TypeName Microsoft.SharePoint.SPQuery
    $query.Query = "<Where><And><Neq><FieldRef Name='WorkflowInstance' /><Value Type='Text'>"+$workflow.InstanceId.ToString("B")+"</Value></Neq><Eq><FieldRef Name='WorkflowInstance' /><Value Type='Text'>Error</Value></Eq></And></Where>"
    $errorItems = $workflow.HistoryList["WorkflowInstance"].GetItems($query)
    if($errorItems -ne $null -and cancel$errorItems.Count worflows-gt here0)
    {
       #stop workflow
    }
}

The problem is in

$workflow | where {$_.InternalState -ne "Completed"}

You are trying to enumerate through $workflow object, wich is not the collection. So as Lance said the good way is to filter workflows:

$badWorkflows = $item.Workflows | Where-Object {($_.InternalState -eq "Running") -and ($_.Created.ToLocalTime().AddHours(4) -lt (Get-Date))}

or scip completed worflows:

foreach ($workflow in $item.Workflows)
{
    if($workflow.IsCompleted -eq $true)
    {
      continue
    }
    #Check date and cancel worflows here
}

The problem is in

$workflow | where {$_.InternalState -ne "Completed"}

You are trying to enumerate through $workflow object, wich is not the collection. So as Lance said the good way is to filter workflows:

$badWorkflows = $item.Workflows | Where-Object {($_.InternalState -eq "Running") -and ($_.Created.ToLocalTime().AddHours(4) -lt (Get-Date))}

or scip completed worflows:

foreach ($workflow in $item.Workflows)
{
    if($workflow.IsCompleted -eq $true)
    {
      continue
    }
    foreach ($task in $workflow.Tasks)
    {
        if($task["WorkflowOutcome"] -eq "Error")
        {
        #stop workflow
        }
    }
    $query=New-Object -TypeName Microsoft.SharePoint.SPQuery
    $query.Query = "<Where><And><Neq><FieldRef Name='WorkflowInstance' /><Value Type='Text'>"+$workflow.InstanceId.ToString("B")+"</Value></Neq><Eq><FieldRef Name='WorkflowInstance' /><Value Type='Text'>Error</Value></Eq></And></Where>"
    $errorItems = $workflow.HistoryList["WorkflowInstance"].GetItems($query)
    if($errorItems -ne $null -and $errorItems.Count -gt 0)
    {
       #stop workflow
    }
}
Source Link
Ruslan Dayanov
  • 1.6k
  • 11
  • 17

The problem is in

$workflow | where {$_.InternalState -ne "Completed"}

You are trying to enumerate through $workflow object, wich is not the collection. So as Lance said the good way is to filter workflows:

$badWorkflows = $item.Workflows | Where-Object {($_.InternalState -eq "Running") -and ($_.Created.ToLocalTime().AddHours(4) -lt (Get-Date))}

or scip completed worflows:

foreach ($workflow in $item.Workflows)
{
    if($workflow.IsCompleted -eq $true)
    {
      continue
    }
    #Check date and cancel worflows here
}