Scripts/Start-BPATask.ps1

function Start-BPATask {
    <#
        .SYNOPSIS
            Starts AutoMate BPA tasks.
 
        .DESCRIPTION
            Start-BPATask starts tasks.
 
        .PARAMETER InputObject
            The tasks to start.
 
        .INPUTS
            Tasks can be supplied on the pipeline to this function.
 
        .EXAMPLE
            # Starts task "My Task" on agent "agent01"
            Get-BPATask "My Task" | Start-BPATask -Agent "agent01"
 
        .NOTES
            Author(s): : David Seibel
            Contributor(s) :
            Date Created : 09/15/2016
            Date Modified : 05/01/2018
 
        .LINK
            https://github.com/davidseibel/PoshBPA
    #>

    [CmdletBinding()]
    [OutputType([System.Object[]])]
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [ValidateNotNullOrEmpty()]
        $InputObject,

        [Parameter(ParameterSetName = "Agent")]
        [ValidateNotNullOrEmpty()]
        $Agent,
        
        [Parameter(ParameterSetName = "AgentGroup")]
        [ValidateNotNullOrEmpty()]
        $AgentGroup
    )

    PROCESS {
        foreach ($obj in $InputObject) { 
            if ($obj.TypeName -eq "Task") {
                switch($PSCmdlet.ParameterSetName) {
                    "Agent" {            
                        if ($Agent.TypeName -ne "Agent") {
                            $name = $Agent
                            $Agent = Get-BPAAgent -Name $name -BPAServer $obj.BPAServer
                            if (($Agent | Measure-Object).Count -ne 1) {
                                throw "Agent '$name' not found!"
                            }
                        }                        
                        if ($Agent.AgentTypeName -eq "TaskAgent") {
                            Write-Verbose "Running task $($obj.Name) on agent $($Agent.Name)."
                            $instanceID = Invoke-BPARestMethod -Resource "tasks/$($obj.ID)/run?agent_id=$($Agent.ID)" -RestMethod Post -BPAServer $obj.BPAServer
                            Start-Sleep -Seconds 1   # The instance can't be retrieved right away, have to pause briefly
                            Invoke-BPARestMethod -Resource ('instances/list?filter_sets="ID","=","\"' + $instanceID + '\""') -RestMethod Get -BPAServer $obj.BPAServer
                        } else {
                            throw "Agent $($Agent.Name) is not a process agent!"                            
                        }
                    }
                    "AgentGroup" {
                        if ($AgentGroup.TypeName -ne "AgentGroup") {
                            $name = $AgentGroup
                            $AgentGroup = Get-BPAAgentGroup -Name $name -BPAServer $obj.BPAServer
                            if (($AgentGroup | Measure-Object).Count -ne 1) {
                                throw "Agent group '$name' not found!"
                            }
                        }

                        Write-Verbose "Running task $($obj.Name) on agent group $($AgentGroup.Name)."
                        $instanceID = Invoke-BPARestMethod -Resource "tasks/$($obj.ID)/run?agent_group_id=$($AgentGroup.ID)" -RestMethod Post -BPAServer $obj.BPAServer
                        Start-Sleep -Seconds 1   # The instance can't be retrieved right away, have to pause briefly
                        Invoke-BPARestMethod -Resource ('instances/list?filter_sets="ID","=","\"' + $instanceID + '\""') -RestMethod Get -BPAServer $obj.BPAServer
                    }
                }
            } else {
                if ($_) { $message = "Unsupported input type '$($obj.TypeName)' encountered!" }
                else    { $message = "Unsupported input type '$($obj.Type)' encountered!"     }
                Write-Error -Message $message -TargetObject $obj
            }
        }
    }
}