Public/Commands/CommandResults/Get-JCCommandResult.ps1

function Get-JCCommandResult () {
    [CmdletBinding(DefaultParameterSetName = 'ReturnAll')]

    param
    (
        [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName, ParameterSetName = 'ByID', Position = 0, HelpMessage = 'The _id of the JumpCloud Command Result you wish to query.')]
        [Alias('_id', 'id')]
        [String]$CommandResultID,

        [Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName, ParameterSetName = 'ByCommandID', HelpMessage = 'The _id of the JumpCloud Command you wish to query.')]
        [Alias('WorkflowID')]
        [String]$CommandID,

        [Parameter(ValueFromPipeline, ParameterSetName = 'ByCommandID', HelpMessage = 'Use the -ByCommandID parameter when you want to query the results of a specific Command via pipeline. The -ByCommandID SwitchParameter will set the ParameterSet to ''ByCommandID'' which queries all JumpCloud Command Results for that particular Command.')]
        [Switch]$ByCommandID,

        [Parameter(DontShow, ParameterSetName = 'ByID', HelpMessage = 'Use the -ByID parameter when you want to query the contents of a specific Command Result or if the -CommandResultID is being passed over the pipeline to return the full contents of a JumpCloud Command Result. The -ByID SwitchParameter will set the ParameterSet to ''ByID'' which queries one JumpCloud Command Result at a time.')]
        [Switch]$ByID,

        [Parameter(ParameterSetName = 'Detailed', HelpMessage = 'A switch parameter to return the detailed output of each command result')]
        [Switch]$Detailed,

        [Parameter(ParameterSetName = 'TotalCount', HelpMessage = 'A switch parameter to only return the number of command results.')]
        [Switch]$TotalCount
    )
    begin {
        Write-Verbose 'Verifying JCAPI Key'
        if ([System.String]::IsNullOrEmpty($JCAPIKEY)) {
            Connect-JConline
        }

        Write-Verbose 'Populating API headers'
        $hdrs = @{

            'Content-Type' = 'application/json'
            'Accept'       = 'application/json'
            'X-API-KEY'    = $JCAPIKEY
        }
        if ($JCOrgID) {
            $hdrs.Add('x-org-id', "$($JCOrgID)")
        }

        $Parallel = $JCConfig.parallel.Calculated

        if ($Parallel) {
            Write-Debug "Parallel set to True, PSVersion greater than 7"
            $resultsArray = [System.Collections.Concurrent.ConcurrentBag[object]]::new()
            $resultsArrayList = [System.Collections.Concurrent.ConcurrentBag[object]]::new()
        } else {
            Write-Verbose 'Initilizing resultsArraylist'
            $resultsArray = New-Object -TypeName System.Collections.ArrayList
            $resultsArrayList = New-Object -TypeName System.Collections.ArrayList
        }
        $limit = 100
    }
    process {
        switch ($PSCmdlet.ParameterSetName) {
            TotalCount {
                $CountURL = "$JCUrlBasePath/api/commandresults?limit=1&skip=0"
                $results = Invoke-RestMethod -Method GET -Uri  $CountURL -Headers $hdrs -UserAgent:(Get-JCUserAgent)
                $null = $resultsArrayList.Add($results.totalCount)
            }#End TotalCount
            ReturnAll {
                $limitURL = "$JCUrlBasePath/api/commandresults"
                if ($Parallel) {
                    $resultsArrayList = Get-JCResults -Url $limitURL -method "GET" -limit $limit -parallel $true
                } else {
                    $resultsArrayList = Get-JCResults -Url $limitURL -method "GET" -limit $limit
                }
                $count = ($resultsArrayList.Count)
                Write-Verbose "Results count equals $count"
            }#End ReturnAll
            ByCommandID {
                # Gather all CommandResults
                $limitURL = "$JCUrlBasePath/api/commandresults"
                if ($Parallel) {
                    $resultsArray = Get-JCResults -Url $limitURL -method "GET" -limit $limit -parallel $true
                } else {
                    $resultsArray = Get-JCResults -Url $limitURL -method "GET" -limit $limit
                }

                # If -ByCommandID is specified and an object is piped into the function, the object will be converted to string
                if ($CommandID -match "@{") {
                    Write-Debug "Command from pipeline..."
                    $Match = Select-String "_id=(\S*)[};]" -inputobject $CommandID
                    # Get the CommandID via regex
                    $CommandID = $Match.matches.groups[1].value
                    Write-Debug "Match: $($Match.matches.groups[1].value)"
                }

                Write-Debug "CommandID: $CommandID"

                # Validate that parallel is valid
                if (($resultsArray.count -gt 1) -and $Parallel) {
                    Write-Debug "Parallel validated..."
                    $GetJCUserAgent = Get-JCUserAgent
                    # Iterate through all the CommandResults objects
                    $resultsArray | Foreach-Object -Parallel {
                        # If the workflowId for the CommandResult does not match the CommandID, skip
                        $CommandID = $using:CommandID
                        if ($_.workflowId -ne $CommandID) {
                            return
                        }
                        $resultsArrayList = $using:resultsArrayList
                        $URL = "$using:JCUrlBasePath/api/commandresults/$($_._id)"
                        $CommandResults = Invoke-RestMethod -Method GET -Uri $URL -Headers $using:hdrs -MaximumRetryCount 5 -RetryIntervalSec 5 -UserAgent:$using:GetJCUserAgent

                        $FormattedResults = [PSCustomObject]@{
                            name               = $CommandResults.name
                            command            = $CommandResults.command
                            system             = $CommandResults.system
                            systemId           = $CommandResults.systemId
                            organization       = $CommandResults.organization
                            workflowId         = $CommandResults.workflowId
                            workflowInstanceId = $CommandResults.workflowInstanceId
                            output             = $CommandResults.response.data.output
                            exitCode           = $CommandResults.response.data.exitCode
                            user               = $CommandResults.user
                            sudo               = $CommandResults.sudo
                            requestTime        = $CommandResults.requestTime
                            responseTime       = $CommandResults.responseTime
                            _id                = $CommandResults._id
                            error              = $CommandResults.response.error
                        }
                        $null = $resultsArrayList.Add($FormattedResults)
                    }
                    # After parallel loop is complete, sort final object by requestTime
                    $resultsArrayList = $resultsArrayList | Sort-Object -Property requestTime
                } else {
                    $resultsArray | Foreach-Object {
                        if ($_.workflowId -ne $CommandID) {
                            return
                        }
                        $URL = "$JCUrlBasePath/api/commandresults/$($_._id)"
                        $CommandResults = Get-JCResults -Method "GET" -URL $URL -limit $limit

                        $FormattedResults = [PSCustomObject]@{
                            name               = $CommandResults.name
                            command            = $CommandResults.command
                            system             = $CommandResults.system
                            systemId           = $CommandResults.systemId
                            organization       = $CommandResults.organization
                            workflowId         = $CommandResults.workflowId
                            workflowInstanceId = $CommandResults.workflowInstanceId
                            output             = $CommandResults.response.data.output
                            exitCode           = $CommandResults.response.data.exitCode
                            user               = $CommandResults.user
                            sudo               = $CommandResults.sudo
                            requestTime        = $CommandResults.requestTime
                            responseTime       = $CommandResults.responseTime
                            _id                = $CommandResults._id
                            error              = $CommandResults.response.error
                        }
                        $null = $resultsArrayList.Add($FormattedResults)
                    }
                }
            }#End ByCommandID
            ByID {
                $URL = "$JCUrlBasePath/api/commandresults/$CommandResultID"
                Write-Verbose $URL
                try {
                    $CommandResults = Invoke-RestMethod -Method GET -Uri $URL -Headers $hdrs -UserAgent:(Get-JCUserAgent)
                } catch {
                    throw $_
                }
                $FormattedResults = [PSCustomObject]@{

                    name               = $CommandResults.name
                    command            = $CommandResults.command
                    system             = $CommandResults.system
                    systemId           = $CommandResults.systemId
                    organization       = $CommandResults.organization
                    workflowId         = $CommandResults.workflowId
                    workflowInstanceId = $CommandResults.workflowInstanceId
                    output             = $CommandResults.response.data.output
                    exitCode           = $CommandResults.response.data.exitCode
                    user               = $CommandResults.user
                    sudo               = $CommandResults.sudo
                    requestTime        = $CommandResults.requestTime
                    responseTime       = $CommandResults.responseTime
                    _id                = $CommandResults._id
                    error              = $CommandResults.response.error
                }
                $null = $resultsArrayList.Add($FormattedResults)
            }#End ByID
            Detailed {
                $results = Get-JCCommandResult
                if ($Parallel) {
                    $UserAgent = Get-JCUserAgent
                    $results | Foreach-Object -Parallel {
                        $resultsArrayList = $using:resultsArrayList
                        $JCUrlBasePath = $using:JCUrlBasePath
                        $URL = "$JCUrlBasePath/api/commandresults/$($_._id)"
                        try {
                            $CommandResults = Invoke-RestMethod -Method GET -Uri $URL -Headers $using:hdrs -UserAgent:($using:UserAgent)
                        } catch {
                            throw $_
                        }
                        $FormattedResults = [PSCustomObject]@{

                            name               = $CommandResults.name
                            command            = $CommandResults.command
                            system             = $CommandResults.system
                            systemId           = $CommandResults.systemId
                            organization       = $CommandResults.organization
                            workflowId         = $CommandResults.workflowId
                            workflowInstanceId = $CommandResults.workflowInstanceId
                            output             = $CommandResults.response.data.output
                            exitCode           = $CommandResults.response.data.exitCode
                            user               = $CommandResults.user
                            sudo               = $CommandResults.sudo
                            requestTime        = $CommandResults.requestTime
                            responseTime       = $CommandResults.responseTime
                            _id                = $CommandResults._id
                            error              = $CommandResults.response.error
                        }
                        $null = $resultsArrayList.Add($FormattedResults)
                    }
                } else {
                    $results | Foreach-Object {
                        $result = Get-JCCommandResult -ID $_._id
                        $null = $resultsArrayList.Add($result)
                    }
                }
            }#End Detailed
        }
    }
    end {
        switch ($PSCmdlet.ParameterSetName) {
            ReturnAll {
                Return $resultsArrayList
            }
            TotalCount {
                Return  $resultsArrayList
            }
            ByCommandID {
                Return  $resultsArrayList
            }
            ByID {
                Return  $resultsArrayList
            }
            Detailed {
                Return  $resultsarrayList
            }
        }
    }
}