Functions/Public/Start-AMTask.ps1

function Start-AMTask {
    <#
        .SYNOPSIS
            Starts AutoMate Enterprise tasks.
 
        .DESCRIPTION
            Start-AMTask starts tasks.
 
        .PARAMETER InputObject
            The tasks to start.
 
        .PARAMETER Agent
            The agent to run the task on.
 
        .PARAMETER AgentGroup
            The agent group to run the task on.
 
        .INPUTS
            Tasks can be supplied on the pipeline to this function.
 
        .EXAMPLE
            # Starts task "My Task" on agent "agent01"
            Get-AMTask "My Task" | Start-AMTask -Agent "agent01"
 
        .LINK
            https://github.com/AutomatePS/AutomatePS
    #>

    [CmdletBinding(SupportsShouldProcess=$true,ConfirmImpact="Medium")]
    [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.Type -eq "Task") {
                $connection = Get-AMConnection -ConnectionAlias $obj.ConnectionAlias
                switch($PSCmdlet.ParameterSetName) {
                    "Agent" {
                        if ($Agent -is [string]) {
                            $name = $Agent
                            # Can't assign agent directly because of ValidateNotNullOrEmpty on parameter
                            $tempAgent = Get-AMAgent -Name $name -Connection $obj.ConnectionAlias
                            if (($tempAgent | Measure-Object).Count -eq 1) {
                                $Agent = $tempAgent
                            } else {
                                throw "Agent '$name' not found!"
                            }
                        }
                        if ($Agent.Type -eq "Agent") {
                            if ($Agent.AgentType -eq "TaskAgent") {
                                if ($Agent.ConnectionAlias -eq $obj.ConnectionAlias) {
                                    Write-Verbose "Running task $($obj.Name) on agent $($Agent.Name)."
                                    $runUri = Format-AMUri -Path "tasks/$($obj.ID)/run" -Parameters "agent_id=$($Agent.ID)"
                                } else {
                                    throw "Task '$($obj.Name)' and agent '$($Agent.Name)' are not on the same server!"
                                }
                            } else {
                                throw "Agent $($Agent.Name) is not a task agent!"
                            }
                        } else {
                            throw "Unsupported agent type '$($Agent.Type)' encountered!"
                        }
                    }
                    "AgentGroup" {
                        if ($AgentGroup -is [string]) {
                            $name = $AgentGroup
                            # Can't assign agent directly because of ValidateNotNullOrEmpty on parameter
                            $tempAgentGroup = Get-AMAgentGroup -Name $name -Connection $obj.ConnectionAlias
                            if (($tempAgentGroup | Measure-Object).Count -eq 1) {
                                $AgentGroup = $tempAgentGroup
                            } else {
                                throw "Agent group '$name' not found!"
                            }
                        }
                        if ($AgentGroup.Type -eq "AgentGroup") {
                            if ($AgentGroup.ConnectionAlias -eq $obj.ConnectionAlias) {
                                Write-Verbose "Running task $($obj.Name) on agent group $($AgentGroup.Name)."
                                $runUri = Format-AMUri -Path "tasks/$($obj.ID)/run" -Parameters "agent_group_id=$($AgentGroup.ID)"
                            } else {
                                throw "Task '$($obj.Name)' and agent group '$($AgentGroup.Name)' are not on the same server!"
                            }
                        } else {
                            throw "Unsupported agent group type '$($AgentGroup.Type)' encountered!"
                        }
                    }
                }
                if ($PSCmdlet.ShouldProcess($connection.Name, "Starting task: $(Join-Path -Path $obj.Path -ChildPath $obj.Name)")) {
                    $instanceID = Invoke-AMRestMethod -Resource $runUri -RestMethod Post -Connection $obj.ConnectionAlias
                    Start-Sleep -Seconds 1   # The instance can't be retrieved right away, have to pause briefly
                    $listUri = Format-AMUri -Path "instances/list" -FilterSet @{Property = "ID"; Operator = "="; Value = $instanceID}
                    Invoke-AMRestMethod -Resource $listUri -RestMethod Get -Connection $obj.ConnectionAlias
                }
            } else {
                Write-Error -Message "Unsupported input type '$($obj.Type)' encountered!" -TargetObject $obj
            }
        }
    }
}