Scripts/Start-BPAProcess.ps1

function Start-BPAProcess {
    <#
        .SYNOPSIS
            Starts AutoMate BPA processes.
 
        .DESCRIPTION
            Start-BPAProcess starts processes.
 
        .PARAMETER InputObject
            The processes to start.
 
        .INPUTS
            Processes can be supplied on the pipeline to this function.
 
        .EXAMPLE
            # Starts process "My Process" on agent "agent01"
            Get-BPAProcess "My Process" | Start-BPAProcess -Agent "agent01"
 
        .NOTES
            Author(s): : David Seibel
            Contributor(s) :
            Date Created : 09/23/2016
            Date Modified : 02/27/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 "Process") {
                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 "ProcessAgent") {
                            Write-Verbose "Running process $($obj.Name) on agent $($Agent.Name)."
                            $instanceID = Invoke-BPARestMethod -Resource "processes/$($obj.ID)/run?process_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 process $($obj.Name) on agent group $($AgentGroup.Name)."
                        $instanceID = Invoke-BPARestMethod -Resource "processes/$($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 -TargetObject $obj
            }
        }
    }
}