Private/New-OSDAppOfficeConfiguration.ps1

function New-OSDAppOfficeConfiguration {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)][string]$Path,
        [ValidateSet('Current','MonthlyEnterprise','SemiAnnual','CurrentPreview','SemiAnnualPreview','BetaChannel')]
        [string]$Channel = 'Current',
        [ValidateSet('x64','x86')][string]$Architecture = 'x64',
        [ValidateSet('O365ProPlusRetail','O365BusinessRetail')][string]$ProductId = 'O365ProPlusRetail',
        [string[]]$Language = @('en-us'),
        [bool]$AcceptEula = $true,
        [bool]$UpdatesEnabled = $true,
        [bool]$SharedComputerLicensing = $false,
        [bool]$DeviceBasedLicensing = $false,
        [string[]]$ExcludeApp,
        [switch]$IncludeVisio,
        [switch]$IncludeProject
    )

    if ($SharedComputerLicensing -and $DeviceBasedLicensing) {
        throw 'SharedComputerLicensing and DeviceBasedLicensing cannot both be enabled.'
    }
    $languages = @($Language | Where-Object { -not [string]::IsNullOrWhiteSpace($_) })
    if ($languages.Count -eq 0) { throw 'At least one Office language must be specified.' }

    $settings = New-Object System.Xml.XmlWriterSettings
    $settings.Indent = $true
    $settings.Encoding = New-Object System.Text.UTF8Encoding($false)
    $writer = [System.Xml.XmlWriter]::Create($Path, $settings)
    try {
        $writer.WriteStartDocument()
        $writer.WriteStartElement('Configuration')
        $writer.WriteStartElement('Add')
        $writer.WriteAttributeString('OfficeClientEdition', $(if ($Architecture -eq 'x64') { '64' } else { '32' }))
        $writer.WriteAttributeString('Channel', $Channel)

        $products = @($ProductId)
        if ($IncludeVisio) { $products += 'VisioProRetail' }
        if ($IncludeProject) { $products += 'ProjectProRetail' }

        foreach ($product in $products) {
            $writer.WriteStartElement('Product')
            $writer.WriteAttributeString('ID', $product)
            foreach ($culture in $languages) {
                $writer.WriteStartElement('Language')
                $writer.WriteAttributeString('ID', $culture)
                $writer.WriteEndElement()
            }
            if ($product -eq $ProductId) {
                foreach ($app in @($ExcludeApp)) {
                    if ([string]::IsNullOrWhiteSpace($app)) { continue }
                    $writer.WriteStartElement('ExcludeApp')
                    $writer.WriteAttributeString('ID', $app)
                    $writer.WriteEndElement()
                }
            }
            $writer.WriteEndElement()
        }

        $writer.WriteEndElement()
        $writer.WriteStartElement('Display')
        $writer.WriteAttributeString('Level', 'None')
        $writer.WriteAttributeString('AcceptEULA', $(if ($AcceptEula) { 'TRUE' } else { 'FALSE' }))
        $writer.WriteEndElement()
        if ($SharedComputerLicensing) {
            $writer.WriteStartElement('Property')
            $writer.WriteAttributeString('Name', 'SharedComputerLicensing')
            $writer.WriteAttributeString('Value', '1')
            $writer.WriteEndElement()
        }
        if ($DeviceBasedLicensing) {
            $writer.WriteStartElement('Property')
            $writer.WriteAttributeString('Name', 'DeviceBasedLicensing')
            $writer.WriteAttributeString('Value', '1')
            $writer.WriteEndElement()
        }
        $writer.WriteStartElement('Updates')
        $writer.WriteAttributeString('Enabled', $(if ($UpdatesEnabled) { 'TRUE' } else { 'FALSE' }))
        $writer.WriteEndElement()
        $writer.WriteEndElement()
        $writer.WriteEndDocument()
    }
    finally { $writer.Dispose() }
}