Public/Functions/FeatureUpdate/Save-FeatureUpdate.ps1

function Save-FeatureUpdate {
    <#
    .SYNOPSIS
    Downloads a Windows Client Feature Update
 
    .DESCRIPTION
    Downloads a Windows Client Feature Update
 
    .EXAMPLE
    Save-FeatureUpdate
 
    .LINK
    https://github.com/OSDeploy/OSD/tree/master/Docs
    #>


    [CmdletBinding(DefaultParameterSetName = 'ByOSName')]
    param (
        #Path to save the Feature Update
        #Default = C:\OSDCloud\OS
        [Parameter(ValueFromPipeline = $true)]
        [Alias ('DownloadFolder','Path')]
        [System.String]
        $DownloadPath = 'C:\OSDCloud\OS',

        #Operating System Name
        #Default = Windows 11 22H2 x64
        [Parameter(ParameterSetName = 'ByOSName')]
        [ValidateSet(
            'Windows 11 23H2 x64',    
            'Windows 11 22H2 x64',
            'Windows 11 21H2 x64',
            'Windows 10 22H2 x64'
            )]
        [Alias('Name')]
        [System.String]
        $OSName = 'Windows 11 22H2 x64',

        #Operating System Version
        #Default = Windows 11
        [Parameter(ParameterSetName = 'v1')]
        [ValidateSet('Windows 11','Windows 10')]
        [Alias('Version')]
        [System.String]
        $OSVersion = 'Windows 11',

        #Operating System ReleaseID
        #Default = 22H2
        [Parameter(ParameterSetName = 'v1')]
        [ValidateSet('22H2','21H2','21H1','20H2','2004','1909','1903','1809')]
        [Alias('Build','OSBuild','ReleaseID')]
        [System.String]
        $OSReleaseID = '22H2',

        #Operating System Architecture
        #Default = x64
        [ValidateSet('x64','x86')]
        [Alias('Arch','OSArch','Architecture')]
        [System.String]
        $OSArchitecture = 'x64',

        #Operating System Activation
        #Default = Volume
        [ValidateSet('Retail','Volume')]
        [Alias('License','OSLicense','Activation')]
        [System.String]
        $OSActivation = 'Volume',

        #Operating System Language
        #Default = en-us
        [ValidateSet (
            'ar-sa','bg-bg','cs-cz','da-dk','de-de','el-gr',
            'en-gb','en-us','es-es','es-mx','et-ee','fi-fi',
            'fr-ca','fr-fr','he-il','hr-hr','hu-hu','it-it',
            'ja-jp','ko-kr','lt-lt','lv-lv','nb-no','nl-nl',
            'pl-pl','pt-br','pt-pt','ro-ro','ru-ru','sk-sk',
            'sl-si','sr-latn-rs','sv-se','th-th','tr-tr',
            'uk-ua','zh-cn','zh-tw')]
        [Alias('Culture','OSCulture','Language')]
        [System.String]
        $OSLanguage = 'en-us'
    )
    
    #=================================================
    # Import Local FeatureUpdates
    #=================================================
    #$Results = Get-WSUSXML -Catalog FeatureUpdate -Silent
    $Results = Get-OSDCloudOperatingSystems
    #=================================================
    # OSLanguage
    #=================================================
    #$Results = $Results | Where-Object {$_.Title -match $OSLanguage}
    $Results = $Results | Where-Object {$_.Language -match $OSLanguage}
    #=================================================
    # OSActivation
    #=================================================
    #switch ($OSActivation) {
    # Retail {$Results = $Results | Where-Object {$_.Title -match 'consumer'}}
    # Volume {$Results = $Results | Where-Object {$_.Title -match 'business'}}
    #}
    $Results = $Results | Where-Object {$_.Activation -match $OSActivation}
    #=================================================
    # v1
    #=================================================
    if ($PSCmdlet.ParameterSetName -eq 'v1') {
        Write-Verbose -Message 'v1'
        #$Results = $Results | Where-Object {$_.UpdateArch -eq $OSArchitecture}
        $Results = $Results | Where-Object {$_.Architecture -eq $OSArchitecture}
        #$Results = $Results | Where-Object {$_.UpdateOS -match $OSVersion}
        $Results = $Results | Where-Object {$_.Version -match $OSVersion}
        #$Results = $Results | Where-Object {$_.UpdateBuild -eq $OSReleaseID}
        $Results = $Results | Where-Object {$_.ReleaseID -eq $OSReleaseID}
    }
    else {
        $Results = $Results | Where-Object {$_.Architecture -eq $OSArchitecture}
    }
    #=================================================
    # ByOSName
    #=================================================
    if ($PSCmdlet.ParameterSetName -eq 'ByOSName') {
        switch ($OSName) {
            #'Windows 11 22H2 x64' {$Results = $Results | Where-Object {$_.UpdateOS -match 'Windows 11'} | Where-Object {$_.UpdateBuild -eq '22H2'}}
            #'Windows 11 22H2 x64' {$Results = $Results | Where-Object {$_.UpdateOS -match 'Windows 11'} | Where-Object {$_.UpdateBuild -eq '22H2'}}
            #'Windows 11 21H2 x64' {$Results = $Results | Where-Object {$_.UpdateOS -match 'Windows 11'} | Where-Object {$_.UpdateBuild -eq '21H2'}}
            #'Windows 10 22H2 x64' {$Results = $Results | Where-Object {$_.UpdateOS -match 'Windows 10'} | Where-Object {$_.UpdateBuild -eq '22H2'}}
            'Windows 11 23H2 x64'   {$Results = $Results | Where-Object {$_.Version -match 'Windows 11'} | Where-Object {$_.ReleaseID -eq '23H2'}}
            'Windows 11 22H2 x64'   {$Results = $Results | Where-Object {$_.Version -match 'Windows 11'} | Where-Object {$_.ReleaseID -eq '22H2'}}
            'Windows 11 21H2 x64'   {$Results = $Results | Where-Object {$_.Version -match 'Windows 11'} | Where-Object {$_.ReleaseID -eq '21H2'}}
            'Windows 10 22H2 x64'   {$Results = $Results | Where-Object {$_.Version -match 'Windows 10'} | Where-Object {$_.ReleaseID -eq '22H2'}}

        }
    }

    #=================================================
    # Results
    #=================================================
    $GetFeatureUpdate = $Results | Sort-Object CreationDate -Descending | Select-Object -First 1
    #=================================================
    # SaveWebFile
    #=================================================
    if ($GetFeatureUpdate) {
        if (Test-Path "$DownloadPath\$($GetFeatureUpdate.FileName)") {
            Get-Item "$DownloadPath\$($GetFeatureUpdate.FileName)"
        }
        elseif (Test-WebConnection -Uri "$($GetFeatureUpdate.FileUri)") {
            $SaveWebFile = Save-WebFile -SourceUrl $GetFeatureUpdate.FileUri -DestinationDirectory "$DownloadPath" -DestinationName $GetFeatureUpdate.FileName

            if (Test-Path $SaveWebFile.FullName) {
                Get-Item $SaveWebFile.FullName
            }
            else {
                Write-Warning "Could not download the Feature Update"
            }
        }
        else {
            Write-Warning "Could not verify an Internet connection for the Feature Update"
        }
    }
    else {
        Write-Warning "Unable to determine a suitable Feature Update"
    }
}