Public/FeatureUpdate.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
function Get-FeatureUpdate {
    [CmdletBinding()]
    param (
        [ValidateSet('Windows 10','Windows 11')]
        [string]$OSVersion = 'Windows 10',

        [ValidateSet('Retail','Volume')]
        [Alias('License')]
        [string]$OSLicense = 'Volume',

        [ValidateSet('21H2','21H1','20H2','2004','1909','1903','1809')]
        [Alias('Build')]
        [string]$OSBuild = '21H2',

        [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')]
        [string]$OSLanguage = 'en-us'
    )
    #=================================================
    # Import Local FeatureUpdates
    #=================================================
    $GetFeatureUpdate = Import-Clixml "$($MyInvocation.MyCommand.Module.ModuleBase)\Catalogs\FeatureUpdate\Catalog.xml"
    #=================================================
    # Filter Compatible
    #=================================================
    $GetFeatureUpdate = $GetFeatureUpdate | `
        Where-Object {$_.UpdateBuild -eq $OSBuild} | `
        Where-Object {$_.UpdateArch -eq 'x64'} | `
        Where-Object {$_.Title -match $OSLanguage}
    #=================================================
    # $OSVersion
    #=================================================
    if ($OSVersion -eq 'Windows 10') {
        $GetFeatureUpdate = $GetFeatureUpdate | Where-Object {$_.UpdateOS -eq 'Windows 10'}
    }
    else {
        $GetFeatureUpdate = $GetFeatureUpdate | Where-Object {$_.UpdateOS -eq 'Windows 11'}
    }
    #=================================================
    # $OSLicense
    #=================================================
    if ($OSLicense -eq 'Retail') {
        $GetFeatureUpdate = $GetFeatureUpdate | Where-Object {$_.Title -match 'consumer'}
    }
    else {
        $GetFeatureUpdate = $GetFeatureUpdate | Where-Object {$_.Title -match 'business'}
    }
    #=================================================
    # Pick and Sort
    #=================================================
    $GetFeatureUpdate = $GetFeatureUpdate | Sort-Object CreationDate -Descending | Select-Object -First 1
    #=================================================
    # Return
    #=================================================
    Return $GetFeatureUpdate
    #=================================================
}
function Save-FeatureUpdate {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline = $true)]
        [Alias ('DownloadFolder','Path')]
        [string]$DownloadPath = 'C:\OSDCloud\OS',

        [ValidateSet('Retail','Volume')]
        [Alias('License')]
        [string]$OSLicense = 'Volume',

        [ValidateSet('21H2','21H1','20H2','2004','1909','1903','1809')]
        [Alias('Build')]
        [string]$OSBuild = '21H1',

        [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')]
        [string]$OSLanguage = 'en-us'
    )
    #=================================================
    # Get-FeatureUpdate
    #=================================================
    $GetFeatureUpdate = Get-FeatureUpdate -OSLicense $OSLicense -OSBuild $OSBuild -OSLanguage $OSLanguage
    #=================================================
    # 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"
    }
}