Public/Invoke-EvaluateSessionRelevance.ps1

function Invoke-EvaluateSessionRelevance {
    <#
   .Synopsis
    Evaluates Session Relevance statements.
   
   .Description
    Evaluates Session Relevance statements on the established Web Reports Session,
    parsing results into a more PowerShell-friendly format. Relevance Statements can
    be provided via the -Relevance parameter or the pipeline. Results are returned
    only after all Relevance Statements have completed.
    
   .Parameter Relevance
    Specifies the Session Relevance statement to evaluate on the Web Reports Session.
 
   .Parameter Session
    Specifies the Web Reports Session to evaluate the relevance on. If not provided,
    will attempt to use the last Web Reports Session created via New-WebReportsSession.
   
   .Parameter FieldNames
    Specifies a listing of field names to translate the evaluation tuple results into.
 
   .Example
    # Evaluate the Session Relevance statement 'number of bes computers'.
    Invoke-EvaluateSessionRelevance -Relevance 'number of bes computers'
 
   .Example
    # Evaluate the Session Relevance statement '(id of it, (if (exists name of it) then (name of it)
    # else ("<not reported>")) of it) of bes computers', parsing results into objects with the field
    # names 'Id' and 'Name'.
    Invoke-EvaluateSessionRelevance -Relevance '(id of it, (if (exists name of it) then (name of it) else ("<not reported>")) of it) of bes computers' -FieldNames @('Id', 'Name')
     
  #>

  [CmdLetBinding()]
  [OutputType('BigFix.SessionRelevanceResult')]
  param(
    [Parameter(
      Mandatory = $true, 
      Position = 0, 
      ValueFromPipeline = $true,
      HelpMessage = 'Session Relevance statement to evaluate'
    )]
    [ValidateNotNullOrEmpty()]
    [string]$Relevance, 

    [Parameter(
      Mandatory = $false,
      HelpMessage = 'Web Reports Session to perform the evaluation in'
    )]
    [ValidateNotNull()]
    [PSTypeName('BigFix.WebReports.Session')]$Session = (Get-WebReportsSession),

    [Parameter(
      Mandatory = $false,
      HelpMessage = 'Array of strings representing the names for each resultant tuple field'
    )]
    [string[]]$FieldNames = $null
  )               
  Begin {
    if ($null -eq $Session) {
      throw "Cannot validate argument on parameter 'Session'. The argument is null. Call New-WebReportsSession first or provide a valid value for the argument, and then try running the command again."
    }
  
    if ($Session.State -ne 'Connected' -and $Session.State -ne 'Connecting') {
      $Session.Connect()
    }

    if ($Session.State -eq 'Connecting' -or $null -eq $Session.SessionToken) {
      $header = New-Object "$($Session.Service.GetType().Namespace).LoginHeader"
      $header.username = $Session.Credential.UserName
      $header.password = $Session.Credential.GetNetworkCredential().Password            
    }
    else {
      $header = New-Object "$($Session.Service.GetType().Namespace).AuthenticateHeader"
      $header.username = $Session.Credential.UserName
      $header.sessionToken = $Session.SessionToken
    }

    $Session.Service.RequestHeaderElement = $header
  }
  
  Process {
    $result = [PSCustomObject]@{
      PSTypeName     = 'BigFix.SessionRelevanceResult'
      Relevance      = $Relevance
      Results        = $null
      Error          = $null
      Time           = $null
      EvaluationTime = $null
    }

    $timer = [System.Diagnostics.Stopwatch]::StartNew()
    try {
      Write-Verbose -Message "Evaluating Relevance: $Relevance"
          
      $structuredResult = $Session.Service.GetStructuredRelevanceResult($Relevance)
          
      $result.EvaluationTime = $structuredResult.evaltime

      if ($structuredResult.error) { 
        $result.Error = $structuredResult.error
      } 
      else {
        $results = New-Object System.Collections.ArrayList -ArgumentList $structuredResult.results.Items.Count
        foreach ($item in $structuredResult.results.Items) {
          $parsedResult = ParseStructuredResult -Result $item -FieldNames $FieldNames
          $null = $results.Add($parsedResult)
        }
        $result.Results = $results.ToArray()
      }
    }
    catch {
      $result.Error = $PSItem.ToString()
      $Session.State = 'Error'
    }
    finally {
      $null = $timer.Stop()
      $result.Time = $timer.Elapsed

      if ($result.Error) {
        Write-Verbose -Message "Evaluation failed: $($result.Error)"
      }
      else {
        $Session.SessionToken = $Session.Service.ResponseHeaderElement.sessionToken
        Write-Verbose -Message "Evaluation produced $($result.Results.Count.ToString('N0')) answer(s) in $($result.Time)."
      }
    }

    return $result
  }
}