Private/HV-SCVMM/Get-HVSCVMMWorkloadFilter.ps1

function Get-HVSCVMMWorkloadFilter {
    #Requires -Version 3.0

    [CmdletBinding()]
    [OutputType([scriptblock])]
    Param (
        [Parameter(ParameterSetName = 'ByWLPair', Mandatory)]
        [PSCustomObject[]]$WorkloadPair,
        [Parameter(ParameterSetName = 'ByNamePath', Mandatory)]
        [string]$ComputerName,
        [Parameter(ParameterSetName = 'ByNamePath', Mandatory)]
        [string]$Path,
        [Parameter(ParameterSetName = 'ByWLPair')]
        [Parameter(ParameterSetName = 'ByNamePath')]
        [switch]$Destination
    )

    $ErrorActionPreference = 'Stop'

    Write-Debug -Message ('ENTER {0}' -f $MyInvocation.MyCommand.Name)

    try {
        Write-Debug -Message ('ENTER TRY {0}' -f $MyInvocation.MyCommand.Name)

        Write-Debug -Message ('$WorkloadPair: ''{0}''' -f [string]$WorkloadPair)
        Write-Debug -Message ('$ComputerName = ''{0}''' -f $ComputerName)
        Write-Debug -Message ('$Path = ''{0}''' -f $Path)
        Write-Debug -Message ('$Destination: ''{0}''' -f $Destination)

        Write-Debug -Message 'if (-not $WorkloadPair)'
        if (-not $WorkloadPair) {
            Write-Debug -Message ('$ComputerMaintenanceConfiguration = Get-ComputerMaintenanceConfiguration -ComputerName ''{0}''' -f $ComputerName)
            $ComputerMaintenanceConfiguration = Get-ComputerMaintenanceConfiguration -ComputerName $ComputerName
            Write-Debug -Message ('$ComputerMaintenanceConfiguration: ''{0}''' -f [string]$ComputerMaintenanceConfiguration)
            Write-Debug -Message '$WorkloadConfiguration = $ComputerMaintenanceConfiguration.Workload'
            $WorkloadConfiguration = $ComputerMaintenanceConfiguration.Workload
            Write-Debug -Message ('$WorkloadConfiguration: ''{0}''' -f [string]$WorkloadConfiguration)
            Write-Debug -Message ('$WorkloadPair = $WorkloadConfiguration | Where-Object -FilterScript {{$_.Path -eq ''{0}''}}' -f $Path)
            $WorkloadPair = $WorkloadConfiguration | Where-Object -FilterScript {$_.Path -eq $Path}
        }
        Write-Debug -Message ('$WorkloadPair: ''{0}''' -f [string]$WorkloadPair)

        Write-Debug -Message 'if ($Destination)'
        if ($Destination) {
            $WorkloadPairPath = $WorkloadPair.DestinationPath
            $WorkloadPairFilter = $WorkloadPair.DestinationFilter
        }
        else {
            $WorkloadPairPath = $WorkloadPair.Path
            $WorkloadPairFilter = $WorkloadPair.Filter
        }
        Write-Debug -Message ('$WorkloadPairPath = ''{0}''' -f $WorkloadPairPath)
        Write-Debug -Message ('$WorkloadPairFilter: ''{0}''' -f $WorkloadPairFilter)

        Write-Debug -Message ('$FilterPath = [System.IO.Path]::Combine(''{0}'', ''*'')' -f $WorkloadPairPath)
        $FilterPath = [System.IO.Path]::Combine($WorkloadPairPath, '*') # Join-Path cannot combine paths on a drive which does not exist on the machine
        Write-Debug -Message ('$FilterPath = ''{0}''' -f $FilterPath)
        Write-Debug -Message ('$FilterString = ''$_.Location -like ''''{{0}}'''''' -f ''{0}''' -f $FilterPath)
        $FilterString = '$_.Location -like ''{0}''' -f $FilterPath
        Write-Debug -Message ('$FilterString = ''{0}''' -f $FilterString)


        Write-Debug -Message '$Filter = $WorkloadPairFilter'
        $Filter = $WorkloadPairFilter
        Write-Debug -Message ('$Filter = ''{0}''' -f $Filter)
        Write-Debug -Message 'if ($Filter)'
        if ($Filter) {
            Write-Debug -Message ('$FilterString = ''{{0}} -and {{1}}'' -f ''{0}'', ''{1}''' -f $FilterString, $Filter)
            $FilterString = '{0} -and {1}' -f $FilterString, $Filter
        }
        Write-Debug -Message ('$FilterString = ''{0}''' -f $FilterString)

        Write-Debug -Message ('[scriptblock]::Create(''{0}'')' -f $FilterString)
        [scriptblock]::Create($FilterString)

        Write-Debug -Message ('EXIT TRY {0}' -f $MyInvocation.MyCommand.Name)
    }
    catch {
        Write-Debug -Message ('ENTER CATCH {0}' -f $MyInvocation.MyCommand.Name)

        Write-Debug -Message ('{0}: $PSCmdlet.ThrowTerminatingError($_)' -f $MyInvocation.MyCommand.Name)
        $PSCmdlet.ThrowTerminatingError($_)

        Write-Debug -Message ('EXIT CATCH {0}' -f $MyInvocation.MyCommand.Name)
    }

    Write-Debug -Message ('EXIT {0}' -f $MyInvocation.MyCommand.Name)
}