private/core-operatingsystem/Get-OSDCloudCoreOperatingSystems.ps1

function Get-OSDCloudCoreOperatingSystems {
    <#
    .SYNOPSIS
    Gets parsed operating system records for OSDCloud selection workflows.
 
    .DESCRIPTION
    Converts raw module catalog records from Get-ModuleCoreOperatingSystems into
    normalized OSDCloud operating system objects. The function maps build numbers
    to known Windows releases, derives build versions, normalizes architecture,
    identifies activation channel, and emits sorted records with media metadata
    such as language, size, file name, path, and hashes.
 
    .EXAMPLE
    Get-OSDCloudCoreOperatingSystems
 
    Returns all available OSDCloud operating system records.
 
    .EXAMPLE
    Get-OSDCloudCoreOperatingSystems | Where-Object { $_.OSName -eq 'Windows 11' }
 
    Returns only Windows 11 operating system records.
 
    .EXAMPLE
    Get-OSDCloudCoreOperatingSystems | Group-Object OSArchitecture
 
    Groups results by normalized architecture.
 
    .INPUTS
    None
    You cannot pipe input to this function.
 
    .OUTPUTS
    PSCustomObject[]
    Parsed operating system records for OSDCloud catalog operations.
 
    .LINK
    https://www.osdeploy.com/
 
    .NOTES
    Author: OSDeploy
    2026-08-05 - Standardized and expanded comment-based help
    #>

    [CmdletBinding()]
    [OutputType([pscustomobject[]])]
    param ()

    $ErrorActionPreference = 'Stop'
    $records = @()
    $mctRecords = @()

    $mctRecords = Get-ModuleCoreOperatingSystems

    if (-not $mctRecords) {
        return $records
    }

    foreach ($node in ($mctRecords | Sort-Object FileName, LanguageCode, Architecture)) {
        Write-Verbose "[$(Get-Date -format s)] [$($MyInvocation.MyCommand.Name)] Processing $($node.FileName)"

        if ([string]::IsNullOrWhiteSpace($node.FileName) -or $node.FileName.Length -lt 5) {
            continue
        }
            #=================================================
            # OSBuild
            # Get the OSBuild from the FileName
            $OSBuild = $node.FileName.Substring(0, 5)
            #=================================================
            # OperatingSystem / OSName / OSVersion
            # 19045 = Windows 10 22H2
            # 22000 = Windows 11 21H2
            # 22621 = Windows 11 22H2
            # 22631 = Windows 11 23H2
            # 26100 = Windows 11 24H2
            # 26200 = Windows 11 25H2
            # 28000 = Windows 11 26H1
            switch ($OSBuild) {
                '19045' { $OperatingSystem = 'Windows 10 22H2'; $OSName = 'Windows 10'; $OSVersion = '22H2' }
                '22000' { $OperatingSystem = 'Windows 11 21H2'; $OSName = 'Windows 11'; $OSVersion = '21H2' }
                '22621' { $OperatingSystem = 'Windows 11 22H2'; $OSName = 'Windows 11'; $OSVersion = '22H2' }
                '22631' { $OperatingSystem = 'Windows 11 23H2'; $OSName = 'Windows 11'; $OSVersion = '23H2' }
                '26100' { $OperatingSystem = 'Windows 11 24H2'; $OSName = 'Windows 11'; $OSVersion = '24H2' }
                '26200' { $OperatingSystem = 'Windows 11 25H2'; $OSName = 'Windows 11'; $OSVersion = '25H2' }
                '28000' { $OperatingSystem = 'Windows 11 26H1'; $OSName = 'Windows 11'; $OSVersion = '26H1' }
                default { continue }
            }
            #=================================================
            # OSBuildVersion
            # Combination of <OSBuild>.<Sub>
            # Extract from FileName
            #=================================================
            $fileNameParts = $node.FileName -split '\.'
            if ($fileNameParts.Count -lt 2) {
                continue
            }
            $OSBuildVersion = "$($fileNameParts[0]).$($fileNameParts[1])"
            #=================================================
            # OSArchitecture
            # Avoids confusion between x64 releases (amd64/arm64)
            #=================================================
            if ($node.Architecture -match 'x64') {
                $OSArchitecture = 'amd64'
            } elseif ($node.Architecture -match 'arm64') {
                $OSArchitecture = 'arm64'
            } else {
                $OSArchitecture = 'x86'
                continue
            }
            #=================================================
            # OSActivation
            #=================================================
            if ($node.FileName -match 'clientconsumer_ret') {
                $OSActivation = 'Retail'
            }
            elseif ($node.FileName -match 'CLIENTBUSINESS_VOL') {
                $OSActivation = 'Volume'
            }
            else {
                $OSActivation = 'Unknown'
                continue
            }
            #=================================================
            # Id
            #=================================================
            $Id = "$OperatingSystem $OSArchitecture $OSActivation $($node.LanguageCode) $OSBuildVersion"
            #=================================================
            # ObjectProperties
            #=================================================
            $records += [pscustomobject]@{
                Id              = $Id
                OperatingSystem = $OperatingSystem
                OSName          = $OSName
                OSVersion       = $OSVersion
                OSArchitecture  = $OSArchitecture
                OSActivation    = $OSActivation
                OSLanguageCode  = $node.LanguageCode
                OSLanguage      = $node.Language
                OSBuild         = $OSBuild
                OSBuildVersion  = $OSBuildVersion
                # Architecture = $node.Architecture
                Size            = $node.Size
                Sha1            = $node.Sha1
                Sha256          = $node.Sha256
                FileName        = $node.FileName
                FilePath        = $node.FilePath
                # IsRetailOnly = $node.IsRetailOnly
            }
    }
    $records = $records | Sort-Object -Property FileName -Unique
    $records = $records | Sort-Object -Property @{Expression = { $_.OperatingSystem }; Descending = $true }, OSArchitecture, OSActivation, OSLanguageCode
    return $records
}