Functions/Functions/Azure/Confirm-AzVm.ps1

function Confirm-AzVm {
    <#
    .SYNOPSIS
        Tests for the existence of a Virtual Machine in Azure.
 
    .DESCRIPTION
        The Confirm-AzVm function takes the name of an Azure Virtual Machine as input and returns $true if it is found,
        otherwise returns $false.
 
    .PARAMETER VmName
        The name of the Virtual Machine to look for.
 
    .PARAMETER ResourceGroupName
        The name of the Resource Group that the Virtual Machine is supposed to be in.
 
    .PARAMETER Location
        Optional. The location of the Virtual Machine. If provided, the function will look for the Virtual Machine in the
        specified location.
 
    .PARAMETER VMSize
        Optional. The size of the Virtual Machine. If provided, the function will look for the Virtual Machine with the
        specified size.
 
    .PARAMETER OsType
        Optional. The OS type of the Virtual Machine. If provided, the function will look for the Virtual Machine with the
        specified OS type.
 
    .PARAMETER SourceImagePublisherName
        Optional. The publisher name of the source image of the Virtual Machine. If provided, the function will look for the
        Virtual Machine with the specified source image publisher name.
 
    .PARAMETER SourceImageOffer
        Optional. The offer of the source image of the Virtual Machine. If provided, the function will look for the Virtual
        Machine with the specified source image offer.
 
    .PARAMETER SourceImageSku
        Optional. The SKU of the source image of the Virtual Machine. If provided, the function will look for the Virtual
        Machine with the specified source image SKU.
 
    .PARAMETER SourceImageVersion
        Optional. The version of the source image of the Virtual Machine. If provided, the function will look for the Virtual
        Machine with the specified source image version.
 
 
    .EXAMPLE
        # Check if a Virtual Machine named "MyVM01" exists in the resource group "MyResourceGroup01"
        Confirm-AzVm -VmName "MyVM01" -ResourceGroupName "MyResourceGroup01"
 
    .EXAMPLE
        # How to use the Location parameter
        Confirm-AzVm -VmName "MyVM01" -ResourceGroupName "MyResourceGroup01" -Location "East US"
 
    .EXAMPLE
        # How to use the VMSize parameter
        Confirm-AzVm -VmName "MyVM01" -ResourceGroupName "MyResourceGroup01" -VMSize "Standard_DS1_v2"
 
    .EXAMPLE
        # How to use the OsType parameter
        Confirm-AzVm -VmName "MyVM01" -ResourceGroupName "MyResourceGroup01" -OsType "Windows"
 
    .EXAMPLE
        # How to use the SourceImagePublisherName parameter
        Confirm-AzVm -VmName "MyVM01" -ResourceGroupName "MyResourceGroup01" `
            -SourceImagePublisherName "MicrosoftWindowsServer"
 
    .EXAMPLE
        # How to use the SourceImageOffer parameter
        Confirm-AzVm -VmName "MyVM01" -ResourceGroupName "MyResourceGroup01" -SourceImageOffer "WindowsServer"
 
    .EXAMPLE
        # How to use the SourceImageSku parameter
        Confirm-AzVm -VmName "MyVM01" -ResourceGroupName "MyResourceGroup01" -SourceImageSku "2019-Datacenter"
 
    .EXAMPLE
        # How to use the SourceImageVersion parameter
        Confirm-AzVm -VmName "MyVM01" -ResourceGroupName "MyResourceGroup01" -SourceImageVersion "latest"
 
    .EXAMPLE
        # Check if a Virtual Machine named "MyVM01" exists in the resource group "MyResourceGroup01" and store the result in
        # a variable.
        $exists = Confirm-AzVm -VmName "MyVM01" -ResourceGroupName "MyResourceGroup01"
        if ($exists) {
            Write-Output "MyVM01 exists in the MyResourceGroup01 Resource Group."
        } else {
            Write-Output "MyVM01 does not exist in the MyResourceGroup01 Resource Group."
        }
 
    .EXAMPLE
        # How to use this in a Pester test
        Describe "MyVM01 Virtual Machine" {
            It "Should exist in the MyResourceGroup01 Resource Group" {
                Confirm-AzVm -VmName "MyVM01" -ResourceGroupName "MyResourceGroup01" | Should -Be $true
            }
        }
 
    .NOTES
        Author: Doug Seelinger
    #>

    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true)]
        [string]$VmName,
        [Parameter(Mandatory=$true)]
        [string]$ResourceGroupName,
        [Parameter(Mandatory=$false)]
        [string]$Location,
        [Parameter(Mandatory=$false)]
        [string]$VMSize,
        [Parameter(Mandatory=$false)]
        [string]$OsType,
        [Parameter(Mandatory=$false)]
        [string]$SourceImagePublisherName,
        [Parameter(Mandatory=$false)]
        [string]$SourceImageOffer,
        [Parameter(Mandatory=$false)]
        [string]$SourceImageSku,
        [Parameter(Mandatory=$false)]
        [string]$SourceImageVersion
    )
    begin {
        Import-Module Az.Accounts
        Import-Module Az.Compute
        if (-not (Get-AzContext)) {
            Connect-AzAccount
        }
    }
    process {
        try {
            $vm = Get-AzVM -ResourceGroupName $ResourceGroupName -Name $VmName -ErrorAction SilentlyContinue
            if ($vm) {
                if ($Location -and $vm.Location -ne $Location) {
                    return $false
                }
                if ($VMSize -and $vm.HardwareProfile.VmSize -ne $VMSize) {
                    return $false
                }
                if ($OsType -and $vm.StorageProfile.OsDisk.OsType -ne $OsType) {
                    return $false
                }
                if ($SourceImagePublisherName -and $vm.StorageProfile.ImageReference.Publisher -ne $SourceImagePublisherName) 
                {
                    return $false
                }
                if ($SourceImageOffer -and $vm.StorageProfile.ImageReference.Offer -ne $SourceImageOffer) {
                    return $false
                }
                if ($SourceImageSku -and $vm.StorageProfile.ImageReference.Sku -ne $SourceImageSku) {
                    return $false
                }
                if ($SourceImageVersion -and $vm.StorageProfile.ImageReference.Version -ne $SourceImageVersion) {
                    return $false
                }
                return $true
            }
            return $false
        } catch {
            return $false
        }
    }
    end {
    }
}