Get-WindowsVersion.psm1

function Get-WindowsVersion {
    <#
.SYNOPSIS
    List current or History Windows Version from local computer.
.DESCRIPTION
    List current or History Windows Version from local computer.
.PARAMETER History
    List History Windows Version from computer.
.EXAMPLE
    Get-WindowsVersion
    List Windows Version on local computer.
.EXAMPLE
    Get-WindowsVersion -History.
    List History Windows Version on local computer.
.EXAMPLE
    Get-WindowsVersion -History | Sort-Object WindowsVersion -Descending
    List History Windows Version on local computer with descending sorting from WindowsVersion.
#>

    param (
        [switch] $History
    )
    # OS Match
    if (($PsVersionTable.OS -match "10.0") -or ($PsVersionTable.BuildVersion -match "10.0")) {
        # WindowsVersionArray
        $WindowsVersionArray = @()
        $WindowsVersionArray += Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
        $WindowsVersionArray += ForEach-Object {
            $SourceOSName = (Get-ChildItem -Path "HKLM:\SYSTEM\Setup\" | Where-Object Name -Match "Source OS").Name
            if ($SourceOSName) { Get-ItemProperty -Path ($SourceOSName -replace "HKEY_LOCAL_MACHINE", "HKLM:") }
        }
        # WindowsVersionObject
        $WindowsVersionObject = $WindowsVersionArray | ForEach-Object {
            # Variables
            $Build = $_.CurrentBuildNumber
            $DisplayVersion = $_.DisplayVersion
            $InstallTime = ([datetime]::FromFileTime($_.InstallTime))
            $Major = $_.CurrentMajorVersionNumber
            $Minor = $_.CurrentMinorVersionNumber
            $ProductId = $_.ProductId
            $ProductName = $_.ProductName
            $ReleaseId = $_.ReleaseId
            $UBR = $_.UBR
            # Conditions
            if ($Build -ge 22000) { $ProductName = $ProductName -replace "10", "11" } # Windows 11 Build 22000
            if ($DisplayVersion.Length -le 0) { $WindowsVersion = $ReleaseId } else { $WindowsVersion = $DisplayVersion } # Greater Build 19042
            if (-not($Major.Length -le 0)) { $Major = "$Major." } # Add Points
            if (-not($Minor.Length -le 0)) { $Minor = "$Minor." } # Add Points
            if (-not($UBR.Length -le 0)) { $UBR = ".$UBR" } # Add Points
            if ($_ -match "Source OS") { $HistorySource = $true } else { $HistorySource = $false }
            # Object
            [PSCustomObject]@{
                PSTypeName     = "Get-WindowsVersion"
                ComputerName   = $env:COMPUTERNAME
                ProductName    = $ProductName
                WindowsVersion = $WindowsVersion
                WindowsBuild   = "$Major$Minor$Build$UBR"
                ProductId      = $ProductId
                InstallTime    = $InstallTime
                History        = $HistorySource
            }
        }
        if ($History) { $WindowsVersionObject } else { $WindowsVersionObject | Where-Object History -eq $false }
    }
    else {
        Write-Warning "PSVersion OS not Windows 10"
    }
}
New-Alias -Name gwv -Value Get-WindowsVersion
Export-ModuleMember -Alias * -Function Get-WindowsVersion