Public/Get-WinReleaseCurrent.ps1
Function Get-WinReleaseCurrent { <# .Synopsis Parse information from Windows Release Information for current channels .Description This cmdlet parses data form windows release information about current versions and output to a json object. .Parameter OS (Mandatory - 10/11) Specify desired operating system. .Parameter Channel (Mandatory - Servicing/LTSB/LTSC) Specify a specific or partial build to return information on. LTSB and LTSC can be used interchangeably .Parameter Version (Optional - Any valid Version) Specify a specific or partial Version to return information on .EXAMPLE #Return info on all versions on servicing channel for Windows 10 Get-WinReleaseCurrent -OS 10 -Channel servicing .EXAMPLE #Return info on version 22H2 on servicing channel for Windows 11 Get-WinReleaseCurrent -OS 11 -Channel servicing -Version 22H2 .EXAMPLE #Return info on version 1507 on ltsb channel for Windows 10 Get-WinReleaseCurrent -OS 10 -Channel ltsb -Version 1507 #> #> [cmdletbinding()] param ( [Parameter(Mandatory = $True)][ValidateSet("11", "10")] $OS, [Parameter(Mandatory = $True)][ValidateSet("Servicing", "LTSB", "LTSC")] $Channel, [Parameter(Mandatory = $False)] $Version ) Switch ($os) { "10" { $url = "https://docs.microsoft.com/en-us/windows/release-health/release-information" $WebResponse = Invoke-WebRequest $url $req = ConvertFrom-Html -Content $WebResponse switch ($channel) { { "servicing" -eq $_ } { $tables = $req.SelectNodes('//table') | Select-Object -first 1; break } { 'LTSB', 'LTSC' -eq $_ } { $tables = $req.SelectNodes('//table') | Select-Object -skip 1 | Select-Object -first 1; break } default { "Not a valid channel"; break } } $data2 = @() foreach ($table in $tables) { $data = @() foreach ($tablerow in ($tables.Elements('tr') | Select-Object -Skip 1)) { $cells = @($tableRow.Elements('td')).InnerText $obj = New-Object -TypeName PSObject $obj | Add-Member -MemberType NoteProperty -Name "Version" -Value $cells[0] $obj | Add-Member -MemberType NoteProperty -Name "Servicing option" -Value $cells[1] $obj | Add-Member -MemberType NoteProperty -Name "Availability date" -Value $cells[2] $obj | Add-Member -MemberType NoteProperty -Name "Latest revision date" -Value $cells[3] $obj | Add-Member -MemberType NoteProperty -Name "OS build" -Value $cells[4] $obj | Add-Member -MemberType NoteProperty -Name "End of service: Home, Pro, Pro Education and Pro for Workstations" -Value $cells[5] $obj | Add-Member -MemberType NoteProperty -Name "End of service: Enterprise, Education and IoT Enterprise" -Value $cells[6] $obj | Add-Member -MemberType NoteProperty -Name "Operating System" -Value "Win 10" -Force $obj.Version = $obj.Version -replace " \(.*?\)", "" $data += $obj } $data2 += $data } if ($Version) { Return $data2 | Where-Object { $_."Version" -like "*$Version*" } | ConvertTo-Json } else { Return $data2 | ConvertTo-Json } } "11" { $url = "https://docs.microsoft.com/en-us/windows/release-health/windows11-release-information" $WebResponse = Invoke-WebRequest $url $req = ConvertFrom-Html -Content $WebResponse switch ($channel) { { "servicing" -eq $_ } { $tables = $req.SelectNodes('//table') | Select-Object -first 1; break } { 'LTSB', 'LTSC' -eq $_ } { 'No LTSB / LTSC channel release for Windows 11 exists.' ; break } default { "Not a valid channel"; break } } $data2 = @() foreach ($table in $tables) { $data = @() foreach ($tablerow in ($tables.Elements('tr') | Select-Object -Skip 1)) { $cells = @($tableRow.Elements('td')).InnerText $obj = New-Object -TypeName PSObject $obj | Add-Member -MemberType NoteProperty -Name "Version" -Value $cells[0] $obj | Add-Member -MemberType NoteProperty -Name "Servicing option" -Value $cells[1] $obj | Add-Member -MemberType NoteProperty -Name "Availability date" -Value $cells[2] $obj | Add-Member -MemberType NoteProperty -Name "Latest revision date" -Value $cells[3] $obj | Add-Member -MemberType NoteProperty -Name "OS build" -Value $cells[4] $obj | Add-Member -MemberType NoteProperty -Name "End of service: Home, Pro, Pro Education and Pro for Workstations" -Value $cells[5] $obj | Add-Member -MemberType NoteProperty -Name "End of service: Enterprise, Education and IoT Enterprise" -Value $cells[6] $obj | Add-Member -MemberType NoteProperty -Name "Operating System" -Value "Win 11" -Force $obj.Version = $obj.Version -replace " \(.*?\)", "" $data += $obj } $data2 += $data } if ($Version) { Return $data2 | Where-Object { $_."Version" -like "*$Version*" } | ConvertTo-Json } else { Return $data2 | ConvertTo-Json } } default { "Could not find information for the operating system specified."; break } } } |