public/Get-UnraidVm.ps1

function Get-UnraidVm {
    <#
    .SYNOPSIS
        Lists virtual machines.

    .PARAMETER Name
        Filter by name (supports wildcards).

    .PARAMETER Session
        Unraid session (defaults to current session).

    .EXAMPLE
        Get-UnraidVm

    .EXAMPLE
        Get-UnraidVm -Name "Windows*"
    #>

    [CmdletBinding()]
    [OutputType("UnraidVm")]
    param(
        [Parameter(Position = 0, ValueFromPipeline, ValueFromPipelineByPropertyName)]
        [string[]]$Name,

        [Parameter()]
        [UnraidSession]$Session = $script:DefaultUnraidSession
    )

    process {
        $gqlQuery = @"
        query GetVms {
            vms {
                domains {
                    id
                    name
                    state
                }
            }
        }
"@


        $result = Invoke-UnraidQuery -Query $gqlQuery -Session $Session 

        # Todo: Create UnraidVm class?
        $vmList = [System.Collections.Generic.List[UnraidVm]]::new()

        if ($result.vms -and $result.vms.domains) {
            foreach ($domain in $result.vms.domains) {
                $vmObj = [UnraidVm]::new($domain)

                # Clean up display a bit; not really necessary to see all properties by default, even though there aren't many right now
                $propSet   = [System.Management.Automation.PSPropertySet]::new('DefaultDisplayPropertySet', [string[]]@('Name', 'State'))
                $memberSet = [System.Management.Automation.PSMemberSet]::new('PSStandardMembers', [System.Management.Automation.PSMemberInfo[]]@($propSet))

                $vmObj.PSObject.Members.Add($memberSet)

                $shouldOutput = $false

                if (! $Name) {
                    $shouldOutput = $true
                }
                else {
                    foreach ($filter in $Name) {
                        if ($vmObj.Name -like "*$filter*") {
                            $shouldOutput = $true
                            break
                        }
                    }
                }

                if ($shouldOutput) {  $vmList.Add($vmObj) }
            }
        }

        $vmList | Sort-Object Name
    }
}