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 {
        # AsJob not implemented yet!
        
        # 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)"

            if ($Tags.Count -eq 0) {
                $domainJoinSettings = Get-DomainJoinExtensionSettings -KeyVaultName $keyVaultName
                $domainJoinExtension = Set-AzVMExtension -ResourceGroupName $resourceGroupName -Location $resourceLocation -VMName $VMName `
                    -Publisher $domainJoinSettings.Publisher -Type $domainJoinSettings.Type  -TypeHandlerVersion $domainJoinSettings.TypeHandlerVersion `
                    -Name $domainJoinSettings.Name -Settings $domainJoinSettings.Settings -ProtectedSettings $domainJoinSettings.ProtectedSetting -AsJob:$AsJob
            }
            $job
        }
        else {
            Write-CustomHost -Message "VM $VMName already exists"
            $VirtualMachine
        }
    }
}