ContainerHandling/Get-BestGenericImageName.ps1

<#
 .Synopsis
  Get Best Generic NAV/BC Container Image Name
 .Description
  If the best matching generic container name based on the Host Operating system. Returns blank if no generic matches the host OS.
 .Example
  $genericImageName = Get-BestGenericImageName
#>

function Get-BestGenericImageName {
    Param (
        [switch] $onlyMatchingBuilds
    )

    $os = (Get-CimInstance Win32_OperatingSystem)
    if ($os.OSType -ne 18 -or !$os.Version.StartsWith("10.0.")) {
        throw "Unknown Host Operating System"
    }

    $UBR = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion' -Name UBR).UBR
    $hostOsVersion = [System.Version]::Parse("$($os.Version).$UBR")

    $repo = $navContainerHelperConfig.genericImageName.Split(':')[0]
    $tag = $navContainerHelperConfig.genericImageName.Split(':')[1].Replace('{0}','*')

    $imagetags = Get-NavContainerImageTags -imageName $repo
    $versions = @()
    if ($imagetags) {
        $ver = [Version]"0.0.0.0"
        $versions = $imagetags.tags | Where-Object { $_ -like $tag -and [System.Version]::TryParse($_.SubString($tag.indexOf('*'), $_.length-$tag.length+1), [ref]$ver) } | % { [System.Version]($_.SubString($tag.indexOf('*'), $_.length-$tag.length+1)) }
    }
    if (-not $versions) {

        # ImageTags not yet updated - use hardcoded list
        $versions = @(
        "10.0.14393.2906"
        "10.0.14393.2972"
        "10.0.14393.3025"
        "10.0.14393.3085"
        "10.0.14393.3144"
        "10.0.14393.3204"
        "10.0.14393.3326"
        "10.0.14393.3384"
        "10.0.14393.3443"
        "10.0.14393.3506"
        "10.0.14393.3630"
        "10.0.14393.3686"
        "10.0.14393.3750"
        "10.0.17134.1006"
        "10.0.17134.1130"
        "10.0.17134.950"
        "10.0.17763.1040"
        "10.0.17763.1158"
        "10.0.17763.1217"
        "10.0.17763.1282"
        "10.0.17763.437"
        "10.0.17763.504"
        "10.0.17763.557"
        "10.0.17763.615"
        "10.0.17763.678"
        "10.0.17763.737"
        "10.0.17763.864"
        "10.0.17763.914"
        "10.0.17763.973"
        "10.0.18362.116"
        "10.0.18362.175"
        "10.0.18362.239"
        "10.0.18362.295"
        "10.0.18362.356"
        "10.0.18362.476"
        "10.0.18362.535"
        "10.0.18362.592"
        "10.0.18362.658"
        "10.0.18362.720"
        "10.0.18362.778"
        "10.0.18362.836"
        "10.0.18362.900"
        "10.0.18363.476"
        "10.0.18363.535"
        "10.0.18363.592"
        "10.0.18363.658"
        "10.0.18363.720"
        "10.0.18363.778"
        "10.0.18363.836"
        "10.0.18363.900"
        "10.0.19041.264"
        "10.0.19041.329"
        ) | % { [System.Version]$_ }
    }
    
    $genericImageName = ""
    $myversions = $versions | Where-Object { $_.Major -eq $hostOsVersion.Major -and $_.Minor -eq $hostOsVersion.Minor -and $_.Build -eq $hostOsVersion.Build } | Sort-Object
    if (-not $myversions) {
        if (-not $onlyMatchingBuilds) {
            $myversions = $versions | Sort-Object
        }
    }
    if ($myversions) {
        $version = $myversions | Where-Object { $_ -ge $hostOsVersion } | Select-Object -First 1
        if (-not $version) {
            $version = $myversions | Select-Object -Last 1
        }
        $genericImageName = [string]::format($navContainerHelperConfig.genericImageName, $version.ToString())
    }
    $genericImageName
}
Export-ModuleMember -Function Get-BestGenericImageName