Functions/Public/Get-WindowsVersion.ps1

function Get-WindowsVersion {
    <#
    .SYNOPSIS
        Converts a Windows OS version string to a friendly Windows version name.

    .DESCRIPTION
        The Get-WindowsVersion function takes a Windows version string (e.g., "10.0.22000")
        and returns the friendly name (e.g., "Windows 11"). Useful for device inventory
        and reporting scenarios.

    .PARAMETER OSVersion
        The OS version string to convert. Can be in format "10.0.22000" or "10.0.22000.1234".

    .PARAMETER IncludeBuild
        If specified, includes the build number in the output (e.g., "Windows 11 (22000)").

    .INPUTS
        System.String. You can pipe version strings to Get-WindowsVersion.

    .OUTPUTS
        System.String. The friendly Windows version name.

    .EXAMPLE
        Get-WindowsVersion -OSVersion "10.0.22000"

        Returns: "Windows 11"

    .EXAMPLE
        Get-WindowsVersion -OSVersion "10.0.19045"

        Returns: "Windows 10"

    .EXAMPLE
        "10.0.22621" | Get-WindowsVersion -IncludeBuild

        Returns: "Windows 11 (22621)"

    .EXAMPLE
        Get-CimInstance Win32_OperatingSystem | Select-Object -ExpandProperty Version | Get-WindowsVersion

        Gets the friendly name for the current Windows version.

    .NOTES
        Author: Sune Alexandersen Narud
        Version: 1.0.0
        Date: February 2026

        Build Number Reference:
        - Windows 11: 22000+
        - Windows 10: 10240-19045
        - Windows 8.1: 6.3.x
        - Windows 8: 6.2.x
        - Windows 7: 6.1.x

    .LINK
        https://docs.microsoft.com/en-us/windows/release-health/release-information
    #>


    [CmdletBinding()]
    [OutputType([string])]
    param (
        [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
        [ValidateNotNullOrEmpty()]
        [string]$OSVersion,

        [Parameter()]
        [switch]$IncludeBuild
    )

    process {
        # Extract numeric parts using regex
        if ($OSVersion -notmatch '(\d+)\.(\d+)\.(\d+)') {
            return $OSVersion
        }

        $versionParts = $OSVersion -split '\.'
        $majorVersion = [int]$versionParts[0]
        $minorVersion = [int]$versionParts[1]
        $buildNumber = [int]$versionParts[2]

        # Determine the Windows version
        $windowsName = switch ("$majorVersion.$minorVersion") {
            "10.0" {
                if ($buildNumber -ge 22000) {
                    "Windows 11"
                }
                elseif ($buildNumber -ge 10240) {
                    "Windows 10"
                }
                else {
                    "Windows 10 Preview"
                }
            }
            "6.3" { "Windows 8.1" }
            "6.2" { "Windows 8" }
            "6.1" { "Windows 7" }
            "6.0" { "Windows Vista" }
            "5.2" { "Windows Server 2003 / XP x64" }
            "5.1" { "Windows XP" }
            "5.0" { "Windows 2000" }
            default { "Unknown Windows Version ($OSVersion)" }
        }

        if ($IncludeBuild -and $buildNumber) {
            return "$windowsName ($buildNumber)"
        }
        
        return $windowsName
    }
}