Private/New-IntuneAppJSON.ps1

# Takes a hashtable of application parameters and returns the JSON document for an Intune application
function New-IntuneAppJSON {
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '',
        Justification = 'Only builds a JSON string; no system state is changed.')]
    [CmdletBinding()]
    [OutputType([string])]
    param (
        [Parameter(Mandatory = $true)]
        [hashtable]$AppParams
    )

    # Copy the hashtable so the caller's splat is not changed
    $ApplicationParameters = @{}
    foreach ($Key in $AppParams.Keys) {
        $ApplicationParameters[$Key] = $AppParams[$Key]
    }
    # Split out the parameters for the .intunewin file
    $IntuneWinParams = @{
        "MainInstallerFileName" = $ApplicationParameters['MainInstallerFileName']
        "SourceFiles"           = $ApplicationParameters['SourceFiles']
        "OutputFolder"          = $ApplicationParameters['OutputFolder']
    }
    foreach ($Key in 'MainInstallerFileName', 'SourceFiles', 'OutputFolder') {
        $ApplicationParameters.Remove($Key)
    }

    [PSCustomObject]@{
        ApplicationParameters = $ApplicationParameters
        IntuneWinParameters   = $IntuneWinParams
    } | ConvertTo-Json -Depth 10
}