functions/Get-VcdVM.ps1

function Get-VcdVM {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)][string]$Name,
        [Parameter(Mandatory = $false)][string]$vAppName,
        [Parameter(Mandatory = $false)][ValidateNotNull()][string]$APIurl = $GlobalvCDAPIUri,
        [Parameter(Mandatory = $false)][ValidateNotNull()]$Headers = $GlobalvCDHeaders
    )
    try {
        # Check if user has specified a vApp Name
        if ([string]::IsNullOrEmpty($vAppName)) {
            Write-Verbose "Query without vApp"
            $resource = "/query?type=vm&filter=(name==$Name)"
        } else {
            Write-Verbose "Query with vApp $vAppName"
            $vAppXml = Get-VcdvApp -Name $vAppName -Headers $Headers -APIurl $APIurl -ErrorAction Stop
            if ( ($vAppXml | Measure-Object | Select-Object -ExpandProperty Count) -ne 1 ) {
                Write-Error "Found $($vAppXml | Measure-Object | Select-Object -ExpandProperty Count) vApp. Abort." -ErrorAction Stop
            }
            $resource = "/query?type=vm&filter=(name==$Name;container==$($vAppXml.href))"
        }

        # Lookup VM
        Write-Verbose "Query REST API for VM: $Name"
        $Uri = $APIurl + $resource
        $ReturnXml = Invoke-RestMethod -Uri $Uri -Method GET -Headers $Headers -ErrorAction Stop

        if ($ReturnXml.QueryResultRecords.total -eq 1) {
            Write-Verbose "Found VM $Name"
            Return $ReturnXml.QueryResultRecords.VMRecord
        } elseif ($ReturnXml.QueryResultRecords.total -gt 1) {
            Write-Error "Found more than one ($($ReturnXml.QueryResultRecords.total)) VM. Please be more specific"
        } else {
            Write-Error "Found $($ReturnXml.QueryResultRecords.total) VM"
        }
    } catch {
        throw "Could not find VM `"$Name`""
    }
}