Export/New-ScaleSetImage.ps1

function Global:New-ScaleSetImage{
    [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("Version")]
        [Parameter(Mandatory = $false)]
        [string]
        $BCVersion,
        [Alias("CumulativeUpdate")]
        [Parameter(Mandatory = $false)]
        [string]
        $BCCumulativeUpdate,
        [Alias("Language")]
        [Parameter(Mandatory = $false)]
        [string]
        $BCLanguage,
        [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
    )
    process {
        # Put Script in Autostart
        # Download and Install Business Central
        # Deactivate default service
        # Call Sys Prep
        # Put created VM as Scale Set Source
        
        # Copy arguments for NIC creation from parent call
        $VMArguments = @{}
        foreach ($param in $PsBoundParameters.GetEnumerator()| Where-Object {$_.Key -notlike "BC*"}){
            $VMArguments.Add($param.Key,$param.Value)
        }

        # Create new VM (as Application Server), might be a job, might be a VM-object (if VM already exists)
        $vm = New-CustomAzVm @VMArguments -AsJob        
        if ($vm.GetType().ToString() -ne "Microsoft.Azure.Commands.Compute.Models.PSVirtualMachine"){
            # Means: Job is currently running / VM is currently being deploy
            # use
            Write-Host "Receiving job..."
            $vm = Receive-Job -Job $vm -Wait
            Write-Host "Job received"
            # to get the VM-object
        }
        $VMArguments = @{}
        foreach ($param in $PsBoundParameters.GetEnumerator()| Where-Object {$_.Key -like "BC*"}){
            $VMArguments.Add($param.Key.Remove(0,2),$param.Value)
        }
        
        Write-Host "Attempting to Install module on VM..."
        Submit-ScriptToVmAndExecute -ResourceGroupName $ResourceGroupName -ResourceLocation $ResourceLocation -VMName $VMName -ScriptBlockName InstallD365Module
        Write-Host "Attempting to download BC to VM..."
        Submit-ScriptToVmAndExecute -ResourceGroupName $ResourceGroupName -ResourceLocation $ResourceLocation -VMName $VMName -ScriptBlockName DownloadBC -RunParameter $bcVersionArgs
        Write-Host "Attempting to install BC to VM..."
        Submit-ScriptToVmAndExecute -ResourceGroupName $ResourceGroupName -ResourceLocation $ResourceLocation -VMName $VMName -ScriptBlockName InstallBC
    }
}
Export-ModuleMember -Function New-ScaleSetImage