Private/Convert-BaselineToOmaSettings.ps1

<#
.SYNOPSIS
    Converts baseline JSON items to Intune OMA-URI settings.
.DESCRIPTION
    Maps registry-style baseline entries to omaSetting format for windows10CustomConfiguration.
#>

function Convert-BaselineToOmaSettings {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [array]$BaselineItems
    )

    $omaSettings = [System.Collections.Generic.List[object]]::new()
    $seenUris = [System.Collections.Generic.HashSet[string]]::new()

    foreach ($item in $BaselineItems) {
        try {
            $keyName = $item.KeyName
            if ([string]::IsNullOrEmpty($keyName)) { continue }
            
            $valueName = $item.ValueName
            if ($valueName -and $valueName -match '^\*\*del\.') {
                Write-Verbose "Skipping delete operation: $valueName"
                continue
            }
            
            $regValue = $item.RegValue
            $type = if ($null -ne $item.Type) { [int]$item.Type } else { 1 }
            $hive = if ($null -ne $item.Hive) { [int]$item.Hive } else { 0 }
            $friendlyName = if ($item.FriendlyName) { $item.FriendlyName } else { $valueName }
            if ([string]::IsNullOrEmpty($friendlyName)) { $friendlyName = "Setting" }
            $desc = if ($item.URL) { $item.URL } else { "Baseline: $friendlyName" }

            $root = if ($hive -eq 1) { "HKCU" } else { "HKLM" }
            $path = $keyName -replace '\\\\', '\' -replace '\\', '/'
            $path = $path.ToLower()
            if ($path -notmatch '^software/|^system/') {
                $path = "Software/$path"
            }
            
            $pathEncoded = $path -replace ' ', '%20'
            
            $omaUri = "./Device/Vendor/MSFT/Registry/$root/$pathEncoded"
            if ($valueName -and -not [string]::IsNullOrEmpty($valueName)) {
                $valueNameEncoded = $valueName -replace ' ', '%20'
                $omaUri = "$omaUri/$valueNameEncoded"
            }
            
            if ($omaUri.Length -gt 500) {
                Write-Verbose "OMA-URI too long, skipping: $omaUri"
                continue
            }

            $oma = @{
                displayName = $friendlyName
                description = $desc
                omaUri      = $omaUri
            }

            if ($type -eq 4) {
                $oma["@odata.type"] = "#microsoft.graph.omaSettingInteger"
                $intVal = 0
                if ($null -ne $regValue -and $regValue -ne "") {
                    [int]::TryParse($regValue, [ref]$intVal) | Out-Null
                }
                $oma["value"] = $intVal
            }
            else {
                $oma["@odata.type"] = "#microsoft.graph.omaSettingString"
                $strVal = if ($null -ne $regValue) { [string]$regValue } else { "" }
                if ([string]::IsNullOrEmpty($strVal)) {
                    Write-Verbose "Skipping setting with empty value: $friendlyName"
                    continue
                }
                if ($strVal.Length -gt 10000) {
                    Write-Verbose "Value too long, truncating: $friendlyName"
                    $strVal = $strVal.Substring(0, 10000)
                }
                $oma["value"] = $strVal
            }
            
            if ($oma.displayName.Length -gt 256) {
                $oma.displayName = $oma.displayName.Substring(0, 256)
            }

            $uriKey = $omaUri.ToUpper()
            if ($seenUris.Contains($uriKey)) {
                Write-Verbose "Skipping duplicate OMA-URI: $omaUri"
                continue
            }
            $seenUris.Add($uriKey) | Out-Null

            $omaSettings.Add($oma)
        }
        catch {
            Write-Verbose "Skip baseline item: $_"
        }
    }

    return @($omaSettings)
}