Functions/Start-ePoQuery.ps1

Function Start-ePoQuery
{
    <#
    .SYNOPSIS
        Runs a query using the ePo API.
         
    .DESCRIPTION
        Sends the command specified to the McAfee EPO server. Connect-ePoServer has to be run first,
        as this function uses the epoServer global variable created by that functions connection to the server. Uses the Invoke-ePoCommand function.
         
    .PARAMETER QueryId
        The ID number of the query to be run.
             
    .EXAMPLE
        Start-ePoQuery -QueryName "Duplicate Systems Names" -Verbose
 
        Returns the output of the query named Duplicate Systems Name
 
    .EXAMPLE
        $ePoQueries = Get-ePoQuery
        $QueryResults = $ePoQueries | Where {$_.Description -like "*unmanaged*"} | Start-ePoQuery
        $QueryResults
         
        Retruns the output of the core.listQueries API command and stores the PowerShell custom object in a variable $ePoQueries.
        This is then piped to where-object to find queries with a description with unmanged in it.
        This in then piped in turn to the Start-ePoQuery and the results are stored in a variable.
 
    .NOTES
        Added support for Whatif
        Added logic that gets all queries so a QueryName parameter can be used instead of only the QueryId parameter.
        TODO: Determine if I should change the name of this function and incorporate Get-ePoQuery into it as a parameter.
             
             
    #>

    [CmdletBinding(SupportsShouldProcess=$true)]
    param
    (
        [Parameter(Mandatory=$True, ParameterSetName='QueryID',
        ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$true)]
        $QueryId,
        [Parameter(Mandatory=$True, ParameterSetName='QueryName',
        ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$true)]
        $QueryName          
    )
    Begin
    {
        If(!($epoServer))
        {
            Write-Warning "Connection to ePoServer not found. Please run Connect-ePoServer first."
            break
        } 
        #Used to check that the query exists
        $Queries = Get-ePoQuery
        $QueryID 
    }
    Process
    {
        If($QueryId)
        {
            $QueryId = $Queries | Where {$_.QueryId -eq $QueryId} | Select -ExpandProperty QueryId
        }
        If($QueryName)
        {
            $QueryId = $Queries | Where {$_.Name -eq $QueryName} | Select -ExpandProperty QueryId                  
        }
        If($QueryId)
        {
            $results = Invoke-ePOCommand -Command "core.executeQuery" -Parameters "queryId=$($QueryId)"
            If($PSCmdlet.ShouldProcess("$QueryId","Outputting results of query run"))
            {       
               ForEach($result in $results.result.list.row )
               {
                    $result
               }
            }
        }
        else
        {
            Write-Warning "Did not find specified query, please check name or id used"
        }
    }
    End{}
}