Public/Get-LatestNetFrameworkUpdate.ps1

Function Get-LatestNetFrameworkUpdate {
    <#
        .SYNOPSIS
            Retrieves the latest Windows 10 .NET Framework Cumulative Update.

        .DESCRIPTION
            Retrieves the latest Windows 10 .NET Framework Cumulative Update from the Windows 10 update history feed.

        .EXAMPLE

        PS C:\> Get-LatestNetFrameworkUpdate

        This commands reads the the Windows 10 update history feed and returns an object that lists the most recent Windows 10 .NET Framework Cumulative Update.
    #>

    [OutputType([System.Management.Automation.PSObject])]
    [CmdletBinding(SupportsShouldProcess = $False, HelpUri = "https://docs.stealthpuppy.com/docs/latestupdate/usage/get-net")]
    Param (
        [Parameter(Mandatory = $False, Position = 0, ValueFromPipeline, HelpMessage = "Windows OS Name")]
        [ValidateSet('Windows7', 'Windows8', 'Windows10', 'WindowsClient', 'WindowsServer', 'All')]
        [ValidateNotNullOrEmpty()]
        [System.String] $OS = 'Windows10'
    )

    # Get module strings from the JSON
    $resourceStrings = Get-ModuleResource

    # If resource strings are returned we can continue
    If ($Null -ne $resourceStrings) {
        
        # Get the update feed and continue if successfully read
        $updateFeed = Get-UpdateFeed -Uri $resourceStrings.UpdateFeeds.NetFramework
        If ($Null -ne $updateFeed) {

            # Filter the feed for NET Framework updates and continue if we get updates
            $updateList = Get-UpdateNetFramework -UpdateFeed $updateFeed | Where-Object { $_.Title -match $resourceStrings.SearchStrings.$OS }

            If ($Null -ne $updateList) {
                ForEach ($update in $updateList) {

                    # Get download info for each update from the catalog
                    $downloadInfo = Get-UpdateCatalogDownloadInfo -UpdateId $update.ID -OS $resourceStrings.SearchStrings.$OS -Architecture "" | Where-Object { $_.Note }
                    $filteredDownloadInfo = $downloadInfo | Sort-Object -Unique -Property Note

                    if ($filteredDownloadInfo) {
                        # Add the Version and Architecture properties to the list
                        $updateListWithVersionParams = @{
                            InputObject = $filteredDownloadInfo
                            Property = "Note"
                            NewPropertyName = "Version"
                            MatchPattern = $resourceStrings.Matches."$($OS)Version"
                        }
                        $updateListWithVersion = Add-Property @updateListWithVersionParams

                        $updateListWithArchParams = @{
                            InputObject = $updateListWithVersion
                            Property = "Note"
                            NewPropertyName = "Architecture"
                            MatchPattern = $resourceStrings.Matches.Architecture
                        }
                        $updateListWithArch = Add-Property @updateListWithArchParams

                        # If the value for Architecture is blank, make it "x86"
                        $i = 0
                        ForEach ($update in $updateListWithArch) {
                            If ($update.Architecture.Length -eq 0) {
                                $updateListWithArch[$i].Architecture = "x86"
                            }
                            $i++
                        }

                        # Return object to the pipeline
                        Write-Output -InputObject $updateListWithArch
                    }
                }
            }
        }
    }
}