Private/Test-XdWorkerAdvanced.ps1

function Test-XdWorkerAdvanced {
    <#
.SYNOPSIS
    Checks the Status of the XenDesktop Workers Passed In On each Server or Desktop Individually
.DESCRIPTION
    Checks the Status of the XenDesktop Workers Passed In On each Server or Desktop Individually
.PARAMETER Machines
    XenDesktop Machines to use for the checks
.PARAMETER BootThreshold
    Server Boot Threshold
.PARAMETER HighLoad
    Server High Load
.NOTES
    Current Version: 1.0
    Creation Date: 27/06/2018
.CHANGE CONTROL
    Name Version Date Change Detail
    David Brett 1.0 27/06/2018 Function Creation
.EXAMPLE
    None Required
#>


    [CmdletBinding()]
    Param
    (
        [parameter(Mandatory = $true, ValueFromPipeline = $true)]$Broker,
        [parameter(Mandatory = $true, ValueFromPipeline = $true)]$Machines,
        [parameter(Mandatory = $true, ValueFromPipeline = $true)]$BootThreshold,
        [parameter(Mandatory = $true, ValueFromPipeline = $true)]$HighLoad
    )

    Begin {
        $pool = [RunspaceFactory]::CreateRunspacePool(1, [int]$env:NUMBER_OF_PROCESSORS + 1)
        $pool.ApartmentState = "MTA"
        $pool.Open()
        $runspaces = @()
    }

    Process {

        $scriptblock = {
            Param (
                [string]$Machine,
                [string]$BootThreshold,
                [string]$HighLoad
            )

            Add-PSSnapin Citrix.Broker.* -ErrorAction SilentlyContinue

            $Errors = @()
            $Status = "Not Run"

            # Test for Uptime of Machine
            [regex]$rx = "\d\.\d$"
            $data = test-wsman $Machine
            $rx.match($data.ProductVersion)
            if ($rx.match($data.ProductVersion).value -eq '3.0') {
                $os = Get-Ciminstance -ClassName win32_operatingsystem -ComputerName $Machine -ErrorAction Continue
            }
            else {
                $opt = New-CimSessionOption -Protocol Dcom
                $session = new-cimsession -ComputerName $machine -SessionOption $opt
                $os = $session | Get-Ciminstance -ClassName win32_operatingsystem
            }
            $Uptime = $OS.LocalDateTime - $os.LastBootUpTime
            $UptimeDays = $Uptime.Days

            If ($UptimeDays -lt [int]$BootThreshold) {
                Add-PSSnapin Citrix.Broker.* -ErrorAction SilentlyContinue
                $Load = Get-BrokerMachine  -AdminAddress $Broker -HostedMachineName $Machine -Property LoadIndex
                $CurrentLoad = $Load.LoadIndex
                If ($CurrentLoad -lt $HighLoad) {
                    $Status = "Passed"
                }
                else {
                    $Status = "Degraded"
                    $errors += "$Machine has a high load of $CurrentLoad"
                }
            }
            else {
                $Status = "Degraded"
                $errors += "$Machine has not been booted in $UptimeDays days"
            }

            return [PSCustomObject]@{
                'Server'   = $Machine
                'Services' = $Status
                'Errors'   = $Errors
            }
        }

        $Results = @()

        foreach ( $Machine in $Machines) {

            $MachineName = $Machine.HostedMachineName
            $runspace = [PowerShell]::Create()
            $null = $runspace.AddScript($scriptblock)
            $null = $runspace.AddArgument($MachineName)
            $null = $runspace.AddArgument($BootThreshold)
            $null = $runspace.AddArgument($HighLoad)
            $runspace.RunspacePool = $pool
            $runspaces += [PSCustomObject]@{ Pipe = $runspace; Status = $runspace.BeginInvoke() }
        }

        while ($runspaces.Status.IsCompleted -notcontains $true) {}

        foreach ($runspace in $runspaces ) {
            $results += $runspace.Pipe.EndInvoke($runspace.Status)
            $runspace.Pipe.Dispose()
        }

        $pool.Close()
        $pool.Dispose()

        Remove-Variable runspaces -Force

        return $results
    }

    End { }
}