Private/New-CustomAzVm.ps1

function Global:New-CustomAzVm{
    [CmdletBinding()]
    <#
    .SYNOPSIS
        Creates a new Application Server, installs Business Central, sys-preps it and saves it as a Scale Set Source
    .DESCRIPTION
        ...
    #>

    param(        
        [Parameter(Mandatory = $true)]
        [string]
        $ResourceGroupName,        
        [Parameter(Mandatory = $true)]
        [string]
        $ResourceLocation,
        [Parameter(Mandatory = $true)]
        [string]
        $Name,        
        [Alias("VirtualNetworkName")]
        [Parameter(Mandatory = $true)]
        [string]
        $VNetName,
        [Parameter(Mandatory = $true)]
        [string]
        $VMName,
        [Parameter(Mandatory = $true)]
        [string]
        $VMImagePublisher,
        [Parameter(Mandatory = $true)]
        [string]
        $VMImageOffer,
        [Parameter(Mandatory = $true)]
        [string]
        $VMImageSku,
        [Parameter(Mandatory = $true)]
        [string]
        $VMSize,
        [Parameter(Mandatory = $true)]
        [PSCredential]
        $VMCredentials,
        [Parameter(Mandatory = $true)]
        [int]
        $VMDiskSizeInGb,
        [Parameter(Mandatory = $true)]
        [string]
        $VMStorageAccountType,
        [Parameter(Mandatory = $true)]
        [string]
        $VMDataDiskName,
        [Alias("NetworkInterfaceName")]
        [Parameter(Mandatory = $true)]
        [string]
        $NicName,
        [Alias("NetworkInterfacePrivateIP")]
        [Parameter(Mandatory = $false)]
        [string]
        $NicPrivateIP,
        [Parameter(Mandatory = $false)]
        [string]
        $SubnetName,
        [Alias("PublicIPName")]
        [Parameter(Mandatory = $false)]
        [string]
        $PipName,
        [Alias("PublicIPDomainNameLabel")]
        [Parameter(Mandatory = $false)]
        [string]
        $PipDnsLabel,
        [Parameter(Mandatory = $false)]
        [switch]
        $AsJob,
        [HashTable]
        $Tags
    )
    process {
        # Copy arguments for NIC creation from parent call
        $NicArguments = @{}
        foreach ($param in $PsBoundParameters.GetEnumerator()| Where-Object {$_.Key -like "*net*" -or $_.Key -like 'Nic*' -or $_.Key -like 'Pip*' -or $_.Key -like 'Resource*' -or $_.Key -like 'Tags'}){
            $NicArguments.Add($param.Key,$param.Value)            
        }
        
        $NIC = New-CustomAzNetworkInterface @NicArguments

        Write-CustomHost -Message "Checking if VM $VMName already exists..."
        $VirtualMachine = Get-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName -ErrorAction SilentlyContinue
        if (-not ($VirtualMachine)){
            Write-CustomHost -Message "Creating VM $VMName..."
            # Create new VM (as Application Server)
            $VirtualMachine = New-AzVMConfig -VMName $VMName -VMSize $VMSize -AssignIdentity:$SystemAssigned -Tags $Tags
            $VirtualMachine = Set-AzVMOperatingSystem -VM $VirtualMachine -Windows -ComputerName $VMName -Credential $VMCredentials -ProvisionVMAgent
            $VirtualMachine = Add-AzVMNetworkInterface -VM $VirtualMachine -Id $NIC.Id
            $VirtualMachine = Set-AzVMSourceImage -VM $VirtualMachine -PublisherName $VMImagePublisher -Offer $VMImageOffer -Skus $VMImageSku -Version latest
            $VirtualMachine = Add-AzVMDataDisk -VM $VirtualMachine -Name $VMDataDiskName -CreateOption "Empty" -DiskSizeInGB $VMDiskSizeInGb -StorageAccountType $VMStorageAccountType -Lun 0 

            Write-CustomHost -Message "Deploying VM (as job)..."
            $job = New-AzVM -ResourceGroupName $ResourceGroupName -Location $ResourceLocation -VM $VirtualMachine -AsJob:$AsJob
            Write-CustomHost -Message "VM Deployed (Job running)"

            $job
        } else {
            Write-CustomHost -Message "VM $VMName already exists"
            $VirtualMachine
        }
    }
}