Public/Start-OSDCloudCLI.ps1

function Start-OSDCloudCLI {
    <#
    .SYNOPSIS
    Starts the OSDCloud Windows 10 or 11 Build Process from the OSD Module or a GitHub Repository
 
    .DESCRIPTION
    Starts the OSDCloud Windows 10 or 11 Build Process from the OSD Module or a GitHub Repository
 
    .LINK
    https://github.com/OSDeploy/OSD/tree/master/Docs
    #>


    [CmdletBinding(DefaultParameterSetName = 'Default')]
    param (
        #Automatically populated from Get-MyComputerManufacturer -Brief
        [Alias('Manufacturer')]
        [System.String]
        $ComputerManufacturer = (Get-MyComputerManufacturer -Brief),

        #Automatically populated from Get-MyComputerProduct
        [Alias('Product')]
        [System.String]
        $ComputerProduct = (Get-MyComputerProduct),

        #$Global:StartOSDCloudCLI.MSCatalogFirmware = $true
        [System.Management.Automation.SwitchParameter]
        $Firmware = $Global:OSDModuleResource.StartOSDCloudGUI.updateFirmware,

        #Restart the computer after Invoke-OSDCloud to OOBE
        [System.Management.Automation.SwitchParameter]
        $Restart,

        #Shutdown the computer after Invoke-OSDCloud
        [System.Management.Automation.SwitchParameter]
        $Shutdown,

        #Captures screenshots during OSDCloud WinPE
        [System.Management.Automation.SwitchParameter]
        $Screenshot,

        #Skips the Autopilot Task routine
        [System.Management.Automation.SwitchParameter]
        $SkipAutopilot,

        #Skip prompting to wipe Disks
        [System.Management.Automation.SwitchParameter]
        $ZTI,

        [Parameter(ParameterSetName = 'Default')]
        [ValidateSet(
            'Windows 11 24H2 x64',
            'Windows 11 23H2 x64',
            'Windows 11 22H2 x64',
            'Windows 10 22H2 x64')]
        [System.String]
        $OSName,

        #Operating System Version of the Windows installation
        [Parameter(ParameterSetName = 'Legacy')]
        [ValidateSet('Windows 11','Windows 10')]
        [System.String]
        $OSVersion,

        #Operating System Build of the Windows installation
        #Alias = Build
        [Parameter(ParameterSetName = 'Legacy')]
        [ValidateSet('24H2','23H2','22H2','21H2')]
        [Alias('Build','OSBuild')]
        [System.String]
        $OSReleaseID,

        #Operating System Edition of the Windows installation
        #Alias = Edition
        [Parameter(ParameterSetName = 'Default')]
        [Parameter(ParameterSetName = 'Legacy')]
        [ValidateSet('Home','Home N','Home Single Language','Education','Education N','Enterprise','Enterprise N','Pro','Pro N')]
        [Alias('Edition')]
        [System.String]
        $OSEdition,

        #Operating System Language of the Windows installation
        #Alias = Culture, OSCulture
        [Parameter(ParameterSetName = 'Default')]
        [Parameter(ParameterSetName = 'Legacy')]
        [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')]
        [System.String]
        $OSLanguage,

        #License of the Windows Operating System
        [Parameter(ParameterSetName = 'Default')]
        [Parameter(ParameterSetName = 'Legacy')]
        [ValidateSet('Retail','Volume')]
        [Alias('OSLicense')]
        [System.String]
        $OSActivation,

        #Searches for the specified WIM file
        [Parameter(ParameterSetName = 'CustomImage')]
        [System.Management.Automation.SwitchParameter]
        $FindImageFile,

        #Downloads a WIM file specified by the URK
        [Parameter(ParameterSetName = 'CustomImage')]
        [System.String]
        $ImageFileUrl,

        #Images using the specified Image Index
        [Parameter(ParameterSetName = 'CustomImage')]
        [Alias('ImageIndex')]
        [System.String]
        $OSImageIndex = 'AUTO'
    )
    #=================================================
    # $Global:StartOSDCloudCLI
    #=================================================
    $localOSDCloudParams = (Get-Command Start-OSDCloudCLI).Parameters
    $Global:StartOSDCloudCLI = $null
    $Global:StartOSDCloudCLI = [ordered]@{
        LaunchMethod = 'OSDCloudCLI'
        ComputerManufacturer = $ComputerManufacturer
        ComputerModel = (Get-MyComputerModel)
        ComputerProduct = $ComputerProduct
        DriverPack = $null
        DriverPackName = $null
        Function = $MyInvocation.MyCommand.Name
        ImageFileItem = $null
        ImageFileName = $null
        ImageFileUrl = $ImageFileUrl
        IsOnBattery = Get-OSDGather -Property IsOnBattery
        MSCatalogDiskDrivers = $true
        MSCatalogFirmware = $true
        MSCatalogNetDrivers = $true
        MSCatalogScsiDrivers = $true
        OperatingSystem = $null
        OSEdition = $OSEdition
        OSEditionId = $null
        OSEditionValues = $localOSDCloudParams["OSEdition"].Attributes.ValidValues
        OSImageIndex = $OSImageIndex
        OSLanguage = $OSLanguage
        OSLanguageValues = $localOSDCloudParams["OSLanguage"].Attributes.ValidValues
        OSActivation = $OSActivation
        OSActivationValues = $localOSDCloudParams["OSActivation"].Attributes.ValidValues
        OSName = $OSName
        OSNameValues = $localOSDCloudParams["OSName"].Attributes.ValidValues
        OSReleaseID = $OSReleaseID
        OSReleaseIDValues = $localOSDCloudParams["OSReleaseID"].Attributes.ValidValues
        OSVersion = $OSVersion
        OSVersionValues = $localOSDCloudParams["OSVersion"].Attributes.ValidValues
        Restart = $Restart
        ScreenshotCapture = $false
        ScreenshotPath = "$env:TEMP\Screenshots"
        Shutdown = $Shutdown
        SkipAutopilot = $SkipAutopilot
        TimeStart = Get-Date
        ZTI = $ZTI
    }
    #=================================================
    # Update Defaults
    #=================================================
    if ($Firmware) {
        $Global:StartOSDCloudCLI.MSCatalogFirmware = $true
    }
    #=================================================
    # Block
    #=================================================
    Block-StandardUser
    Block-PowerShellVersionLt5
    Block-NoCurl
    #=================================================
    # -Screenshot
    #=================================================
    if ($PSBoundParameters.ContainsKey('Screenshot')) {
        $Global:StartOSDCloudCLI.ScreenshotCapture = $true
        Start-ScreenPNGProcess -Directory $Global:StartOSDCloudCLI.ScreenshotPath
    }
    #=================================================
    # Computer Information
    #=================================================
    Write-Host -ForegroundColor DarkGray "========================================================================="
    Write-Host -ForegroundColor Cyan "[$(Get-Date -format G)] $($Global:StartOSDCloudCLI.Function) | $ComputerManufacturer $($Global:StartOSDCloudCLI.ComputerModel) product $ComputerProduct"
    #=================================================
    # Battery
    #=================================================
    if ($Global:StartOSDCloudCLI.IsOnBattery) {
        Write-Warning "Computer is currently running on Battery"
    }
    #=================================================
    # -ZTI
    #=================================================
    if ($Global:StartOSDCloudCLI.ZTI) {
        $Global:StartOSDCloudCLI.GetDiskFixed = Get-LocalDisk | Where-Object {$_.IsBoot -eq $false} | Sort-Object Number

        if (($Global:StartOSDCloudCLI.GetDiskFixed | Measure-Object).Count -lt 2) {
            Write-Host -ForegroundColor DarkGray "========================================================================="
            Write-Warning "This Warning is displayed when using the -ZTI parameter"
            Write-Warning "OSDisk will be cleaned automatically without confirmation"
            Write-Warning "Press CTRL + C to cancel"
            $Global:StartOSDCloudCLI.GetDiskFixed | Select-Object -Property Number, BusType, MediaType,`
            FriendlyName, PartitionStyle, NumberOfPartitions,`
            @{Name='SizeGB';Expression={[int]($_.Size / 1000000000)}} | Format-Table

            Write-Warning "OSDCloud will continue in 5 seconds"
            Start-Sleep -Seconds 5
        }
        else {
            Write-Host -ForegroundColor DarkGray "========================================================================="
            Write-Warning "More than 1 Fixed Disk is present"
            Write-Warning "Disks will not be cleaned automatically"
            $Global:StartOSDCloudCLI.GetDiskFixed | Select-Object -Property Number, BusType, MediaType,`
            FriendlyName, PartitionStyle, NumberOfPartitions,`
            @{Name='SizeGB';Expression={[int]($_.Size / 1000000000)}} | Format-Table
            Start-Sleep -Seconds 5
        }
    }
    #=================================================
    # Test Web Connection
    #=================================================
    Write-Host -ForegroundColor DarkGray "========================================================================="
    Write-Host -ForegroundColor Cyan "[$(Get-Date -format G)] Test-WebConnection" -NoNewline
    #Write-Host -ForegroundColor DarkGray "google.com"

    if (Test-WebConnection -Uri "google.com") {
        Write-Host -ForegroundColor Green " OK"
    }
    else {
        Write-Host -ForegroundColor Red " FAILED"
        Write-Warning "Could not validate an Internet connection"
        Write-Warning "OSDCloud will continue, but there may be issues if this can't be resolved"
    }
    #=================================================
    # Custom Image
    #=================================================
    if ($Global:StartOSDCloudCLI.ImageFileFullName -and $Global:StartOSDCloudCLI.ImageFileItem -and $Global:StartOSDCloudCLI.ImageFileName) {
        #Custom Image set in OSDCloudGUI
        Break
    }
    #=================================================
    # ParameterSet CustomImage
    #=================================================
    elseif ($PSCmdlet.ParameterSetName -eq 'CustomImage') {
        Write-Host -ForegroundColor DarkGray "========================================================================="
        Write-Host -ForegroundColor Cyan "Custom Windows Image"

        if ($Global:StartOSDCloudCLI.ImageFileUrl) {
            Write-Host -ForegroundColor DarkGray "ImageFileUrl: $($Global:StartOSDCloudCLI.ImageFileUrl)"
            Write-Host -ForegroundColor DarkGray "OSImageIndex: $($Global:StartOSDCloudCLI.OSImageIndex)"
        }
        if ($PSBoundParameters.ContainsKey('FindImageFile')) {
            $Global:StartOSDCloudCLI.ImageFileItem = Select-OSDCloudFileWim

            if ($Global:StartOSDCloudCLI.ImageFileItem) {
                $Global:StartOSDCloudCLI.OSImageIndex = Select-OSDCloudImageIndex -ImagePath $Global:StartOSDCloudCLI.ImageFileItem.FullName

                Write-Host -ForegroundColor DarkGray "ImageFileItem: $($Global:StartOSDCloudCLI.ImageFileItem.FullName)"
                Write-Host -ForegroundColor DarkGray "OSImageIndex: $($Global:StartOSDCloudCLI.OSImageIndex)"
            }
            else {
                $Global:StartOSDCloudCLI.ImageFileItem = $null
                $Global:StartOSDCloudCLI.OSImageIndex = 'AUTO'
                #$Global:OSDImageParent = $null
                #$Global:OSDCloudWimFullName = $null
                Write-Warning "Custom Windows Image on USB was not found"
                Break
            }
        }
    }
    #=================================================
    # ParameterSet Default
    #=================================================
    elseif ($PSCmdlet.ParameterSetName -eq 'Default') {
        if ($Global:StartOSDCloudCLI.OSName) {
            #Do nothing
        }
        elseif ($Global:StartOSDCloudCLI.ZTI) {
            $Global:StartOSDCloudCLI.OSName = 'Windows 11 24H2 x64'
        }
        else {
            Write-Host -ForegroundColor DarkGray "========================================================================="
            Write-Host -ForegroundColor Cyan "[$(Get-Date -format G)] Select an Operating System"

            $i = $null
            $Global:StartOSDCloudCLI.OSNameMenu = foreach ($Item in $Global:StartOSDCloudCLI.OSNameValues) {
                $i++

                $ObjectProperties = @{
                    Selection   = $i
                    Name     = $Item
                }
                New-Object -TypeName PSObject -Property $ObjectProperties
            }

            $Global:StartOSDCloudCLI.OSNameMenu | Select-Object -Property Selection, Name | Format-Table | Out-Host

            do {
                $SelectReadHost = Read-Host -Prompt "Enter the Selection Number"
            }
            until (((($SelectReadHost -ge 0) -and ($SelectReadHost -in $Global:StartOSDCloudCLI.OSNameMenu.Selection))))

            $Global:StartOSDCloudCLI.OSName = $Global:StartOSDCloudCLI.OSNameMenu | Where-Object {$_.Selection -eq $SelectReadHost} | Select-Object -ExpandProperty Name
        }
        $OSName = $Global:StartOSDCloudCLI.OSName

        if ($OSName -match 'Windows 10') {
            $Global:StartOSDCloudCLI.OSVersion = 'Windows 10'
        }
        if ($OSName -match 'Windows 11') {
            $Global:StartOSDCloudCLI.OSVersion = 'Windows 11'
        }
        $OSVersion = $Global:StartOSDCloudCLI.OSVersion

        if ($OSName -match '23H2') {
            $Global:StartOSDCloudCLI.OSReleaseID = '24H2'
        }
        if ($OSName -match '24H2') {
            $Global:StartOSDCloudCLI.OSReleaseID = '23H2'
        }
        if ($OSName -match '22H2') {
            $Global:StartOSDCloudCLI.OSReleaseID = '22H2'
        }
        if ($OSName -match '21H2') {
            $Global:StartOSDCloudCLI.OSReleaseID = '21H2'
        }
        if ($OSName -match '21H1') {
            $Global:StartOSDCloudCLI.OSReleaseID = '21H1'
        }
        if ($OSName -match '20H2') {
            $Global:StartOSDCloudCLI.OSReleaseID = '20H2'
        }
        if ($OSName -match '2004') {
            $Global:StartOSDCloudCLI.OSReleaseID = '2004'
        }
        if ($OSName -match '1909') {
            $Global:StartOSDCloudCLI.OSReleaseID = '1909'
        }
        if ($OSName -match '1903') {
            $Global:StartOSDCloudCLI.OSReleaseID = '1903'
        }
        if ($OSName -match '1809') {
            $Global:StartOSDCloudCLI.OSReleaseID = '1809'
        }
        $OSReleaseID = $Global:StartOSDCloudCLI.OSReleaseID
    }
    #=================================================
    # ParameterSet Legacy
    #=================================================
    elseif ($PSCmdlet.ParameterSetName -eq 'Legacy') {

        if ($Global:StartOSDCloudCLI.OSVersion) {
            #Do nothing
        }
        elseif ($Global:StartOSDCloudCLI.ZTI) {
            $Global:StartOSDCloudCLI.OSVersion = 'Windows 11'
        }
        else {
            Write-Host -ForegroundColor DarkGray "========================================================================="
            Write-Host -ForegroundColor Cyan "[$(Get-Date -format G)] Select an Operating System"

            $i = $null
            $Global:StartOSDCloudCLI.OSVersionMenu = foreach ($Item in $Global:StartOSDCloudCLI.OSVersionValues) {
                $i++

                $ObjectProperties = @{
                    Selection   = $i
                    Name     = $Item
                }
                New-Object -TypeName PSObject -Property $ObjectProperties
            }

            $Global:StartOSDCloudCLI.OSVersionMenu | Select-Object -Property Selection, Name | Format-Table | Out-Host

            do {
                $SelectReadHost = Read-Host -Prompt "Enter the Selection Number"
            }
            until (((($SelectReadHost -ge 0) -and ($SelectReadHost -in $Global:StartOSDCloudCLI.OSVersionMenu.Selection))))

            $Global:StartOSDCloudCLI.OSVersion = $Global:StartOSDCloudCLI.OSVersionMenu | Where-Object {$_.Selection -eq $SelectReadHost} | Select-Object -ExpandProperty Name
        }
        $OSVersion = $Global:StartOSDCloudCLI.OSVersion
        #=================================================
        # OSReleaseID
        #=================================================
        if ($Global:StartOSDCloudCLI.OSReleaseID) {
            #Do nothing
        }
        elseif ($Global:StartOSDCloudCLI.ZTI) {
            $Global:StartOSDCloudCLI.OSReleaseID = '22H2'
        }
        else {
            Write-Host -ForegroundColor DarkGray "========================================================================="
            Write-Host -ForegroundColor Cyan "[$(Get-Date -format G)] Select a ReleaseID for $OSVersion x64"
            
            $i = $null
            $Global:StartOSDCloudCLI.OSReleaseIDMenu = foreach ($Item in $Global:StartOSDCloudCLI.OSReleaseIDValues) {
                $i++
            
                $ObjectProperties = @{
                    Selection   = $i
                    Name     = $Item
                }
                New-Object -TypeName PSObject -Property $ObjectProperties
            }
            
            $Global:StartOSDCloudCLI.OSReleaseIDMenu | Select-Object -Property Selection, Name | Format-Table | Out-Host
            
            do {
                $SelectReadHost = Read-Host -Prompt "Enter the Selection Number"
            }
            until (((($SelectReadHost -ge 0) -and ($SelectReadHost -in $Global:StartOSDCloudCLI.OSReleaseIDMenu.Selection))))
            
            $Global:StartOSDCloudCLI.OSReleaseID = $Global:StartOSDCloudCLI.OSReleaseIDMenu | Where-Object {$_.Selection -eq $SelectReadHost} | Select-Object -ExpandProperty Name
        }
        $OSReleaseID = $Global:StartOSDCloudCLI.OSReleaseID
    }
    #=================================================
    # OSEdition
    #=================================================
    if (($PSCmdlet.ParameterSetName -eq 'Default') -or ($PSCmdlet.ParameterSetName -eq 'Legacy')) {
        if ($Global:StartOSDCloudCLI.OSEdition) {
        }
        elseif ($ZTI) {
            $Global:StartOSDCloudCLI.OSEdition = 'Enterprise'
        }
        else {
            Write-Host -ForegroundColor DarkGray "========================================================================="
            Write-Host -ForegroundColor Cyan "[$(Get-Date -format G)] Select an Operating System Edition"
            $Global:StartOSDCloudCLI.OSEditionValues = @('Home','Home N','Home Single Language','Education','Education N','Enterprise','Enterprise N','Pro','Pro N')

            $i = $null
            $Global:StartOSDCloudCLI.OSEditionMenu = foreach ($Item in $Global:StartOSDCloudCLI.OSEditionValues) {
                $i++
            
                $ObjectProperties = @{
                    Selection   = $i
                    Name     = $Item
                }
                New-Object -TypeName PSObject -Property $ObjectProperties
            }
            
            $Global:StartOSDCloudCLI.OSEditionMenu | Select-Object -Property Selection, Name | Format-Table | Out-Host
            
            do {
                $SelectReadHost = Read-Host -Prompt "Enter the Selection Number"
            }
            until (((($SelectReadHost -ge 0) -and ($SelectReadHost -in $Global:StartOSDCloudCLI.OSEditionMenu.Selection))))
            
            $Global:StartOSDCloudCLI.OSEdition = $Global:StartOSDCloudCLI.OSEditionMenu | Where-Object {$_.Selection -eq $SelectReadHost} | Select-Object -ExpandProperty Name
        }
        #=================================================
        # OSEditionId and OSActivation
        #=================================================
        if ($Global:StartOSDCloudCLI.OSEdition -eq 'Home') {
            $Global:StartOSDCloudCLI.OSEditionId = 'Core'
            $Global:StartOSDCloudCLI.OSActivation = 'Retail'
        }
        if ($Global:StartOSDCloudCLI.OSEdition -eq 'Home N') {
            $Global:StartOSDCloudCLI.OSEditionId = 'CoreN'
            $Global:StartOSDCloudCLI.OSActivation = 'Retail'
        }
        if ($Global:StartOSDCloudCLI.OSEdition -eq 'Home Single Language') {
            $Global:StartOSDCloudCLI.OSEditionId = 'CoreSingleLanguage'
            $Global:StartOSDCloudCLI.OSActivation = 'Retail'
        }
        if ($Global:StartOSDCloudCLI.OSEdition -eq 'Education') {
            $Global:StartOSDCloudCLI.OSEditionId = 'Education'
        }
        if ($Global:StartOSDCloudCLI.OSEdition -eq 'Education N') {
            $Global:StartOSDCloudCLI.OSEditionId = 'EducationN'
        }
        if ($Global:StartOSDCloudCLI.OSEdition -eq 'Pro') {
            $Global:StartOSDCloudCLI.OSEditionId = 'Professional'
        }
        if ($Global:StartOSDCloudCLI.OSEdition -eq 'Pro N') {
            $Global:StartOSDCloudCLI.OSEditionId = 'ProfessionalN'
        }
        if ($Global:StartOSDCloudCLI.OSEdition -eq 'Enterprise') {
            $Global:StartOSDCloudCLI.OSEditionId = 'Enterprise'
            $Global:StartOSDCloudCLI.OSActivation = 'Volume'
        }
        if ($Global:StartOSDCloudCLI.OSEdition -eq 'Enterprise N') {
            $Global:StartOSDCloudCLI.OSEditionId = 'EnterpriseN'
            $Global:StartOSDCloudCLI.OSActivation = 'Volume'
        }
        $OSEdition = $Global:StartOSDCloudCLI.OSEdition
        #=================================================
        # OSActivation
        #=================================================
        if ($Global:StartOSDCloudCLI.OSActivation) {
            #Do nothing
        }
        elseif ($Global:StartOSDCloudCLI.ZTI) {
            $Global:StartOSDCloudCLI.OSActivation = 'Volume'
        }
        else {
            Write-Host -ForegroundColor DarkGray "========================================================================="
            Write-Host -ForegroundColor Cyan "[$(Get-Date -format G)] Select an Operating System License Activation"
            
            $i = $null
            $Global:StartOSDCloudCLI.OSActivationMenu = foreach ($Item in $Global:StartOSDCloudCLI.OSActivationValues) {
                $i++
            
                $ObjectProperties = @{
                    Selection           = $i
                    Name                = $Item
                }
                New-Object -TypeName PSObject -Property $ObjectProperties
            }
            
            $Global:StartOSDCloudCLI.OSActivationMenu | Select-Object -Property Selection, Name | Format-Table | Out-Host
            
            do {
                $SelectReadHost = Read-Host -Prompt "Enter the Selection Number"
            }
            until (((($SelectReadHost -ge 0) -and ($SelectReadHost -in $Global:StartOSDCloudCLI.OSActivationMenu.Selection))))
            
            $Global:StartOSDCloudCLI.OSActivationMenu = $Global:StartOSDCloudCLI.OSActivationMenu | Where-Object {$_.Selection -eq $SelectReadHost} | Select-Object -ExpandProperty Name

            if ($Global:StartOSDCloudCLI.OSActivationMenu -match 'Retail') {
                $Global:StartOSDCloudCLI.OSActivation = 'Retail'
            }
            else {
                $Global:StartOSDCloudCLI.OSActivation = 'Volume'
            }
        }
        $OSActivation = $Global:StartOSDCloudCLI.OSActivation
        Write-Host -ForegroundColor Cyan "OSEditionId: " -NoNewline
        Write-Host -ForegroundColor Green $Global:StartOSDCloudCLI.OSEditionId
        Write-Host -ForegroundColor Cyan "OSImageIndex: " -NoNewline
        Write-Host -ForegroundColor Green $Global:StartOSDCloudCLI.OSImageIndex
        #=================================================
        # OSLanguage
        #=================================================
        if ($Global:StartOSDCloudCLI.OSLanguage) {
        }
        elseif ($PSBoundParameters.ContainsKey('OSLanguage')) {
        }
        elseif ($ZTI) {
            $Global:StartOSDCloudCLI.OSLanguage = 'en-us'
        }
        else {
            Write-Host -ForegroundColor DarkGray "========================================================================="
            Write-Host -ForegroundColor Cyan "[$(Get-Date -format G)] Select an Operating System Language"

            $i = $null
            $Global:StartOSDCloudCLI.OSLanguageMenu = foreach ($Item in $Global:StartOSDCloudCLI.OSLanguageValues) {
                $i++
            
                $ObjectProperties = @{
                    Selection   = $i
                    Name     = $Item
                }
                New-Object -TypeName PSObject -Property $ObjectProperties
            }
            
            $Global:StartOSDCloudCLI.OSLanguageMenu | Select-Object -Property Selection, Name | Format-Table | Out-Host
            
            do {
                $SelectReadHost = Read-Host -Prompt "Enter the Selection number"
            }
            until (((($SelectReadHost -ge 0) -and ($SelectReadHost -in $Global:StartOSDCloudCLI.OSLanguageMenu.Selection))))
            
            $Global:StartOSDCloudCLI.OSLanguage = $Global:StartOSDCloudCLI.OSLanguageMenu | Where-Object {$_.Selection -eq $SelectReadHost} | Select-Object -ExpandProperty Name
        }
        $OSLanguage = $Global:StartOSDCloudCLI.OSLanguage
    }
    #=================================================
    # Default
    #=================================================
    if ($PSCmdlet.ParameterSetName -eq 'Default') {
        Write-Host -ForegroundColor DarkGray "========================================================================="
        Write-Host -ForegroundColor Cyan "Get-OSDCloudOperatingSystems"

        $Global:StartOSDCloudCLI.OperatingSystem = Get-OSDCloudOperatingSystems | Where-Object {$_.Name -match $OSName} | Where-Object {$_.Activation -eq $OSActivation} | Where-Object {$_.Language -eq $OSLanguage}
    }
    #=================================================
    # Legacy
    #=================================================
    if ($PSCmdlet.ParameterSetName -eq 'Legacy') {
        Write-Host -ForegroundColor DarkGray "========================================================================="
        Write-Host -ForegroundColor Cyan "Get-OSDCloudOperatingSystems"

        $Global:StartOSDCloudCLI.OperatingSystem = Get-OSDCloudOperatingSystems | Where-Object {$_.Version -match $OSVersion} | Where-Object {$_.Activation -eq $OSActivation} | Where-Object {$_.Language -eq $OSLanguage} | Where-Object {$_.ReleaseID -eq $OSReleaseID}
    }
    #=================================================
    # Default or Legacy
    #=================================================
    if ($PSCmdlet.ParameterSetName -ne 'CustomImage') {
        if ($Global:StartOSDCloudCLI.OperatingSystem) {
            $Global:StartOSDCloudCLI.ImageFileName = $Global:StartOSDCloudCLI.OperatingSystem.FileName
            $Global:StartOSDCloudCLI.ImageFileUrl = $Global:StartOSDCloudCLI.OperatingSystem.Url
        }
        else {
            Write-Warning "Unable to locate a Windows Feature Update"
            Write-Warning "OSDCloud cannot continue"
            Break
        }

        $Global:StartOSDCloudCLI.ImageFileItem = Find-OSDCloudFile -Name $Global:StartOSDCloudCLI.OperatingSystem.FileName -Path '\OSDCloud\OS\' | Sort-Object FullName | Where-Object {$_.Length -gt 3GB}
        $Global:StartOSDCloudCLI.ImageFileItem = $Global:StartOSDCloudCLI.ImageFileItem | Where-Object {$_.FullName -notlike "C*"} | Where-Object {$_.FullName -notlike "X*"} | Select-Object -First 1

        if ($Global:StartOSDCloudCLI.ImageFileItem) {
            #Write-Host -ForegroundColor Green "OK"
            Write-Host -ForegroundColor DarkGray $Global:StartOSDCloudCLI.OperatingSystem.Name
            Write-Host -ForegroundColor DarkGray $Global:StartOSDCloudCLI.ImageFileItem.FullName
        }
        elseif (Test-WebConnection -Uri $Global:StartOSDCloudCLI.OperatingSystem.Url) {
            #Write-Host -ForegroundColor Yellow "Download"
            Write-Host -ForegroundColor Yellow $Global:StartOSDCloudCLI.OperatingSystem.Name
            Write-Host -ForegroundColor Yellow $Global:StartOSDCloudCLI.OperatingSystem.Url
        }
        else {
            Write-Warning $Global:StartOSDCloudCLI.OperatingSystem.Name
            Write-Warning $Global:StartOSDCloudCLI.OperatingSystem.Url
            Write-Warning "Could not verify an Internet connection for Windows Feature Update"
            Write-Warning "OSDCloud cannot continue"
            Break
        }
    }
    #================================================
    # Set Driver Pack
    # New logic added to Get-OSDCloudDriverPack
    # This should match the proper OS Version ReleaseID
    #================================================
    $Global:StartOSDCloudCLI.DriverPack = Get-OSDCloudDriverPack -Product $ComputerProduct -OSVersion $Global:StartOSDCloudCLI.OSVersion -OSReleaseID $Global:StartOSDCloudCLI.OSReleaseID
    if ($Global:StartOSDCloudCLI.DriverPack) {
        Write-Host -ForegroundColor DarkGray "========================================================================="
        Write-Host -ForegroundColor Cyan "Get-OSDCloudDriverPack"
        $Global:StartOSDCloudCLI.DriverPackName = $Global:StartOSDCloudCLI.DriverPack.Name
        Write-Host -ForegroundColor Yellow $Global:StartOSDCloudCLI.DriverPack.Name
        Write-Host -ForegroundColor Yellow $Global:StartOSDCloudCLI.DriverPack.Url
    }
    #=================================================
    # Invoke-OSDCloud
    #=================================================
    Write-Host -ForegroundColor DarkGray "========================================================================="
    Write-Host -ForegroundColor Green "[$(Get-Date -format G)] Start-OSDCloudCLI Configuration"
    $Global:StartOSDCloudCLI | Out-Host
    Write-Host -ForegroundColor DarkGray "========================================================================="
    #================================================
    # Test TPM
    #================================================
    try {
        $Win32Tpm = Get-CimInstance -Namespace "ROOT\cimv2\Security\MicrosoftTpm" -ClassName Win32_Tpm

        if ($null -eq $Win32Tpm) {
            Write-Host -ForegroundColor Yellow "[$(Get-Date -format G)] TPM: Not Supported"
            Write-Host -ForegroundColor Yellow "[$(Get-Date -format G)] Autopilot: Not Supported"
            Start-Sleep -Seconds 5
        }
        elseif ($Win32Tpm.SpecVersion) {
            if ($null -eq $Win32Tpm.SpecVersion) {
                Write-Host -ForegroundColor Yellow "[$(Get-Date -format G)] TPM: Unable to detect the TPM Version"
                Write-Host -ForegroundColor Yellow "[$(Get-Date -format G)] Autopilot: Not Supported"
                Start-Sleep -Seconds 5
            }

            $majorVersion = $Win32Tpm.SpecVersion.Split(",")[0] -as [int]
            if ($majorVersion -lt 2) {
                Write-Host -ForegroundColor Yellow "[$(Get-Date -format G)] TPM: Version is less than 2.0"
                Write-Host -ForegroundColor Yellow "[$(Get-Date -format G)] Autopilot: Not Supported"
                Start-Sleep -Seconds 5
            }
            else {
                #Write-Host -ForegroundColor DarkGray "[$(Get-Date -format G)] TPM IsActivated: $($Win32Tpm.IsActivated_InitialValue)"
                #Write-Host -ForegroundColor DarkGray "[$(Get-Date -format G)] TPM IsEnabled: $($Win32Tpm.IsEnabled_InitialValue)"
                #Write-Host -ForegroundColor DarkGray "[$(Get-Date -format G)] TPM IsOwned: $($Win32Tpm.IsOwned_InitialValue)"
                #Write-Host -ForegroundColor DarkGray "[$(Get-Date -format G)] TPM Manufacturer: $($Win32Tpm.ManufacturerIdTxt)"
                #Write-Host -ForegroundColor DarkGray "[$(Get-Date -format G)] TPM Manufacturer Version: $($Win32Tpm.ManufacturerVersion)"
                #Write-Host -ForegroundColor DarkGray "[$(Get-Date -format G)] TPM SpecVersion: $($Win32Tpm.SpecVersion)"
                Write-Host -ForegroundColor Green "[$(Get-Date -format G)] TPM 2.0: Supported"
                Write-Host -ForegroundColor Green "[$(Get-Date -format G)] Autopilot: Supported"
            }
        }
        else {
            Write-Host -ForegroundColor Yellow "[$(Get-Date -format G)] TPM: Not Supported"
            Write-Host -ForegroundColor Yellow "[$(Get-Date -format G)] Autopilot: Not Supported"
            Start-Sleep -Seconds 5
        }
    }
    catch {
    }
    #================================================
    # Invoke-OSDCloud
    #================================================
    Write-Host -ForegroundColor Green "[$(Get-Date -format G)] Starting Invoke-OSDCloud in 5 seconds ..."
    Start-Sleep -Seconds 5
    Invoke-OSDCloud
}