Private/HV/Get-HVFilterString.ps1

function Get-HVFilterString {
    [CmdletBinding()]
    [OutputType([scriptblock])]

    Param (
        [string]$Path,
        [string]$Filter,
        [ValidateSet('HV-SCVMM', 'HV-Vanilla')]
        [string]$Mode = 'HV-SCVMM'
    )

    $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 ('$Path = ''{0}''' -f $Path)
        Write-Debug -Message ('$Filter = ''{0}''' -f $Filter)
        Write-Debug -Message ('$Mode = ''{0}''' -f $Mode)

        Write-Debug -Message '$VMLocationPropertyName = switch ($Mode)'
        $VMLocationPropertyName = switch ($Mode) {
            'HV-SCVMM' {
                Write-Debug -Message 'Location'
                'Location'
            }
            'HV-Vanilla' {
                Write-Debug -Message 'Path'
                'Path'
            }
            Default {
                Write-Debug -Message 'Location'
                'Location'
            }
        }
        Write-Debug -Message ('$VMLocationPropertyName = ''{0}''' -f $VMLocationPropertyName)

        if ($Path) {
            Write-Debug -Message ('$FilterPath = [System.IO.Path]::Combine(''{0}'', ''*'')' -f $Path)
            $FilterPath = [System.IO.Path]::Combine($Path, '*') # 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 = ''$_.{{0}} -like ''''{{1}}'''''' -f ''{0}'', ''{1}''' -f $VMLocationPropertyName, $FilterPath)
            $FilterString = ('$_.{0} -like ''{1}''' -f $VMLocationPropertyName, $FilterPath)
            Write-Debug -Message ('$FilterString = ''{0}''' -f $FilterString)

            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
            }
        }
        else {
            Write-Debug -Message ('$FilterString = ''{0}''' -f $Filter)
            $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)
}