Public/Import-OSMedia.ps1

<#
.SYNOPSIS
Imports an Operating System into OSBuilder

.DESCRIPTION
Imports a supported Operating System into the OSBuilder OSMedia directory

.LINK
https://www.osdeploy.com/osbuilder/docs/functions/osmedia/import-osmedia

.PARAMETER CreateISO
New-OSBMediaISO -FullName $FullName
Creates an ISO after Import

.PARAMETER ShowMediaInfo
Show-OSBMediaInfo -FullName $FullName
Displays Media Information after Import

.PARAMETER UpdateOSMedia
Update-OSMedia -Name $Name -DownloadUpdates -Execute
Automatically updates the Imported Operating System

.PARAMETER EditionId
Operating System Edition to import

.EXAMPLE
Import-OSMedia -EditionId Enterprise

.PARAMETER ImageIndex
Operating System Index to Import

.PARAMETER ImageName
Operating System Image Name to Import

.PARAMETER SkipGridView
Used to bypass the ISE GridView Operating System Selection

.EXAMPLE
Import-OSMedia -EditionId Enterprise -SkipGridView

.EXAMPLE
Import-OSMedia -EditionId Enterprise -SkipGridView -UpdateOSMedia
#>

function Import-OSMedia {
    [CmdletBinding(DefaultParameterSetName='Basic')]
    PARAM (
        [switch]$CreateISO,
        [switch]$ShowMediaInfo,
        [switch]$UpdateOSMedia,

        [Parameter(ParameterSetName='Advanced')]
        [ValidateSet('Education','EducationN','Enterprise','EnterpriseN','EnterpriseS','EnterpriseSN','Professional','ProfessionalEducation','ProfessionalEducationN','ProfessionalN','ProfessionalWorkstation','ProfessionalWorkstationN','ServerRdsh','ServerDatacenter','ServerDatacenterACor','ServerRdsh','ServerStandard','ServerStandardACor')]
        [string]$EditionId,
        [Parameter(ParameterSetName='Advanced')]
        [int]$ImageIndex,
        [Parameter(ParameterSetName='Advanced')]
        [ValidateSet('Windows 10 Education','Windows 10 Education N','Windows 10 Enterprise','Windows 10 Enterprise 2016 LTSB','Windows 10 Enterprise for Virtual Desktops','Windows 10 Enterprise LTSC','Windows 10 Enterprise N','Windows 10 Enterprise N LTSC','Windows 10 Pro','Windows 10 Pro Education','Windows 10 Pro Education N','Windows 10 Pro for Workstations','Windows 10 Pro N','Windows 10 Pro N for Workstations','Windows Server 2016 Datacenter','Windows Server 2016 Datacenter (Desktop Experience)','Windows Server 2016 Standard','Windows Server 2016 Standard (Desktop Experience)','Windows Server 2019 Datacenter','Windows Server 2019 Datacenter (Desktop Experience)','Windows Server 2019 Standard','Windows Server 2019 Standard (Desktop Experience)','Windows Server Datacenter','Windows Server Standard')]
        [string]$ImageName,
        [Parameter(ParameterSetName='Advanced')]
        [switch]$SkipGridView
    )

    BEGIN {
        #Write-Host '========================================================================================' -ForegroundColor DarkGray
        #Write-Host "$($MyInvocation.MyCommand.Name) BEGIN" -ForegroundColor Green

        #===================================================================================================
        Write-Verbose '19.1.1 Validate Administrator Rights'
        #===================================================================================================
        if (!([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            Write-Warning 'OSBuilder: This function needs to be run as Administrator'
            Return
        }

        #===================================================================================================
        Write-Verbose '19.1.1 Initialize OSBuilder'
        #===================================================================================================
        Get-OSBuilder -CreatePaths -HideDetails

        #===================================================================================================
        Write-Verbose '19.1.1 Checking Drives'
        #===================================================================================================
        $ImportWims = @()
        $ImportDrives = Get-PSDrive -PSProvider 'FileSystem'
        foreach ($ImportDrive in $ImportDrives) {
            if (Test-Path "$($ImportDrive.Root)Sources") {$ImportWims += Get-ChildItem "$($ImportDrive.Root)Sources" install.* | Select-Object -Property @{Name="OSRoot";Expression={(Get-Item $_.Directory).Parent.FullName}}, @{Name="OSWim";Expression={$_.FullName}}}
            if (Test-Path "$($ImportDrive.Root)x64\Sources") {$ImportWims += Get-ChildItem "$($ImportDrive.Root)x64\Sources" install.* | Select-Object -Property @{Name="OSRoot";Expression={(Get-Item $_.Directory).Parent.FullName}}, @{Name="OSWim";Expression={$_.FullName}}}
            if (Test-Path "$($ImportDrive.Root)x86\Sources") {$ImportWims += Get-ChildItem "$($ImportDrive.Root)x86\Sources" install.* | Select-Object -Property @{Name="OSRoot";Expression={(Get-Item $_.Directory).Parent.FullName}}, @{Name="OSWim";Expression={$_.FullName}}}
        }
        if ($null -eq $ImportWims) {
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            Write-Warning "Windows Image could not be found on any CD or DVD Drives . . . Exiting!"
            Break
        }

        #===================================================================================================
        Write-Verbose '19.1.1 Media: Scan Windows Images'
        #===================================================================================================
        $WindowsImages = $ImportWims | ForEach-Object {
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            Write-Host "Media: Scan $($_.OSWim)" -ForegroundColor Green
            Get-WindowsImage -ImagePath "$($_.OSWim)"} | ForEach-Object {
                Get-WindowsImage -ImagePath "$($_.ImagePath)" -Index $($_.ImageIndex) | Select-Object -Property *
                Write-Host "Index $($_.ImageIndex): $($_.ImageName)" -ForegroundColor DarkGray
            }

        $WindowsImages = $WindowsImages | Select-Object -Property ImagePath, ImageIndex, Languages, ImageName, Architecture, EditionId, Version, MajorVersion, MinorVersion, Build, SPBuild, SPLevel, CreatedTime, ModifiedTime
        foreach ($Image in $WindowsImages) {
            if ($Image.Architecture -eq '0') {$Image.Architecture = 'x86'}
            if ($Image.Architecture -eq '6') {$Image.Architecture = 'ia64'}
            if ($Image.Architecture -eq '9') {$Image.Architecture = 'x64'}
            if ($Image.Architecture -eq '12') {$Image.Architecture = 'x64 ARM'}
        }

        #===================================================================================================
        Write-Verbose '19.1.1 Filter OS Version 6.1.7601 and 10'
        #===================================================================================================
        $WindowsImages = $WindowsImages | Where-Object {$_.Version -like "6.1.7601*" -or $_.MajorVersion -eq '10'}

        #===================================================================================================
        Write-Verbose '19.1.1 Filter Parameters'
        #===================================================================================================
        if ($EditionId) {$WindowsImages = $WindowsImages | Where-Object {$_.EditionId -eq $EditionId}}
        if ($ImageName) {$WindowsImages = $WindowsImages | Where-Object {$_.ImageName -eq $ImageName}}
        if ($ImageIndex) {$WindowsImages = $WindowsImages | Where-Object {$_.ImageIndex -eq $ImageIndex}}

        #===================================================================================================
        Write-Verbose '19.1.1 Select Operating Systems'
        #===================================================================================================
        if (@($WindowsImages).Count -gt 0) {
            if (!($SkipGridView.IsPresent)) {
                $WindowsImages = $WindowsImages | Out-GridView -Title "Import-OSMedia: Select OSMedia to Import and press OK (Cancel to Exit)" -PassThru        
                if($null -eq $WindowsImages) {
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Warning "Import-OSMedia: Compatible OSMedia was not selected . . . Exiting!"
                    Return
                }
            }
        } else {
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            Write-Warning "OSMedia was not found . . . Exiting!"
            Return
        }
    }

    PROCESS {
        Write-Host '========================================================================================' -ForegroundColor DarkGray
        Write-Host "$($MyInvocation.MyCommand.Name) PROCESS" -ForegroundColor Green

        #===================================================================================================
        Write-Verbose '19.1.1 Import Windows Images'
        #===================================================================================================
        foreach ($WindowsImage in $WindowsImages) {

            $OSImagePath = $($WindowsImage.ImagePath)
            $OSImageIndex = $($WindowsImage.ImageIndex)
            $OSSourcePath = (Get-Item $OSImagePath).Directory.Parent.FullName
            $WindowsImage = Get-WindowsImage -ImagePath "$OSImagePath" -Index $OSImageIndex | Select-Object -Property *

            $OSImageName = $($WindowsImage.ImageName)
            $OSImageName = $OSImageName -replace "Windows 7", "Win7"
            $OSImageName = $OSImageName -replace "Windows 10", "Win10"
            $OSImageName = $OSImageName -replace "Enterprise", "Ent"
            $OSImageName = $OSImageName -replace "Education", "Edu"
            $OSImageName = $OSImageName -replace "Virtual Desktops", "VD"
            $OSImageName = $OSImageName -replace " for ", " "
            $OSImageName = $OSImageName -replace "Workstations", "Wks"
            $OSImageName = $OSImageName -replace "Windows Server 2016", "Svr2016"
            $OSImageName = $OSImageName -replace "Windows Server 2019", "Svr2019"
            $OSImageName = $OSImageName -replace "ServerStandardACore", "Std Core"
            $OSImageName = $OSImageName -replace "ServerDatacenterACore", "DC Core"
            $OSImageName = $OSImageName -replace "ServerStandardCore", "Std Core"
            $OSImageName = $OSImageName -replace "ServerDatacenterCore", "DC Core"
            $OSImageName = $OSImageName -replace "ServerStandard", "Std"
            $OSImageName = $OSImageName -replace "ServerDatacenter", "DC"
            $OSImageName = $OSImageName -replace "Standard", "Std"
            $OSImageName = $OSImageName -replace "Datacenter", "DC"
            $OSImageName = $OSImageName -replace 'Desktop Experience', 'DTE'
            $OSImageName = $OSImageName -replace '\(', ''
            $OSImageName = $OSImageName -replace '\)', ''

            $OSImageDescription = $($WindowsImage.ImageDescription)

            $OSArchitecture = $($WindowsImage.Architecture)
            if ($OSArchitecture -eq '0') {$OSArchitecture = 'x86'}
            if ($OSArchitecture -eq '6') {$OSArchitecture = 'ia64'}
            if ($OSArchitecture -eq '9') {$OSArchitecture = 'x64'}
            if ($OSArchitecture -eq '12') {$OSArchitecture = 'x64 ARM'}

            $OSEditionID =          $($WindowsImage.EditionId)
            $OSInstallationType =   $($WindowsImage.InstallationType)
            $OSLanguages =          $($WindowsImage.Languages)
            $OSMajorVersion =       $($WindowsImage.MajorVersion)
            $OSBuild =              $($WindowsImage.Build)
            $OSVersion =            $($WindowsImage.Version)
            $OSSPBuild =            $($WindowsImage.SPBuild)
            $OSSPLevel =            $($WindowsImage.SPLevel)
            $OSImageBootable =      $($WindowsImage.ImageBootable)
            $OSWIMBoot =            $($WindowsImage.WIMBoot)
            $OSCreatedTime =        $($WindowsImage.CreatedTime)
            $OSModifiedTime =       $($WindowsImage.ModifiedTime)

            #===================================================================================================
            Write-Verbose '19.1.1 Image: Export Install.esd'
            #===================================================================================================
            if ($OSImagePath -like "*.esd") {
                $InstallWimType = "esd"
                $TempESD = "$env:Temp\$((Get-Date).ToString('HHmmss')).wim"

                Write-Host '========================================================================================' -ForegroundColor DarkGray
                Write-Host "Image: Export Install.esd Index $OSImageIndex to $TempESD" -ForegroundColor Green
                
                $CurrentLog = "$env:Temp\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Export-WindowsImage.log"
                Write-Verbose "$CurrentLog"
                Export-WindowsImage -SourceImagePath "$OSImagePath" -SourceIndex $OSImageIndex -DestinationImagePath "$TempESD" -CheckIntegrity -CompressionType max -LogPath "$CurrentLog" | Out-Null
            } else {
                $InstallWimType = "wim"
            }

            #===================================================================================================
            Write-Verbose '19.1.1 Image: Mount Windows Image'
            #===================================================================================================
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            $MountDirectory = Join-Path $OSBuilderContent\Mount "os$((Get-Date).ToString('HHmmss'))"
            if (!(Test-Path "$MountDirectory")) {New-Item "$MountDirectory" -ItemType Directory -Force | Out-Null}

            if ($InstallWimType -eq "esd") {
                Write-Host "Image: Mount $TempESD (Index 1) to $MountDirectory" -ForegroundColor Green
                Mount-WindowsImage -ImagePath "$TempESD" -Index '1' -Path "$MountDirectory" -ReadOnly | Out-Null
            } else {
                Write-Host "Image: Mount $OSImagePath (Index $OSImageIndex) to $MountDirectory" -ForegroundColor Green
                Mount-WindowsImage -ImagePath "$OSImagePath" -Index $OSImageIndex -Path "$MountDirectory" -ReadOnly | Out-Null
            }

            #===================================================================================================
            Write-Verbose '19.1.1 Image: Get Registry and UBR'
            #===================================================================================================
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            Write-Host "Image: Mount Registry for UBR Information" -ForegroundColor Green

            reg LOAD 'HKLM\OSMedia' "$MountDirectory\Windows\System32\Config\SOFTWARE" | Out-Null
            $RegCurrentVersion = Get-ItemProperty -Path 'HKLM:\OSMedia\Microsoft\Windows NT\CurrentVersion'
            reg UNLOAD 'HKLM\OSMedia' | Out-Null

            $OSVersionNumber = $null
            $RegCurrentVersionUBR = $null

            #===================================================================================================
            Write-Verbose '19.1.1 Set OS Main Information'
            #===================================================================================================
            if ($OSMajorVersion -eq '10') {
                $OSVersionNumber = $($RegCurrentVersion.ReleaseId)
                $RegCurrentVersionUBR = $($RegCurrentVersion.UBR)
                $UBR = "$OSBuild.$RegCurrentVersionUBR"
                if ($OSVersionNumber -gt 1809) {Write-Warning "OSBuilder does not currently support this version of Windows ... Check for an updated version"}
                $OSMediaName = "$OSImageName $OSArchitecture $OSVersionNumber $OSLanguages $UBR"
            } else {
                $UBR = "$OSBuild.$OSSPBuild"
                $OSMediaName = "$OSImageName $OSArchitecture $OSLanguages $UBR"
            }
            if ($($OSLanguages.count) -eq 1) {$OSMediaName = $OSMediaName.replace(' en-US', '')}

            #===================================================================================================
            Write-Verbose '19.1.1 Set OSMediaPath'
            #===================================================================================================
            $OSMediaPath = Join-Path $OSBuilderOSMedia $OSMediaName

            #===================================================================================================
            Write-Verbose '19.1.1 Remove Existing OSMedia'
            #===================================================================================================
            if (Test-Path $OSMediaPath) {
                Write-Warning "$OSMediaPath exists. Contents will be replaced!"
                Remove-Item -Path "$OSMediaPath" -Force -Recurse
                Write-Host ""
            }

            #===================================================================================================
            Write-Verbose '19.1.1 Set Working Directories'
            #===================================================================================================
            $Info = Join-Path $OSMediaPath 'info'
            if (!(Test-Path "$Info"))           {New-Item "$Info" -ItemType Directory -Force | Out-Null}
            if (!(Test-Path "$Info\json"))      {New-Item "$Info\json" -ItemType Directory -Force | Out-Null}
            if (!(Test-Path "$Info\logs"))      {New-Item "$Info\logs" -ItemType Directory -Force | Out-Null}
            if (!(Test-Path "$Info\xml"))       {New-Item "$Info\xml" -ItemType Directory -Force | Out-Null}
            
            $OS = Join-Path $OSMediaPath 'OS'
            if (!(Test-Path "$OS"))             {New-Item "$OS" -ItemType Directory -Force | Out-Null}

            $WinPE = Join-Path $OSMediaPath 'WinPE'
            if (!(Test-Path "$WinPE"))          {New-Item "$WinPE" -ItemType Directory -Force | Out-Null}

            $PEInfo = Join-Path $WinPE 'info'
            if (!(Test-Path "$PEInfo"))         {New-Item "$PEInfo" -ItemType Directory -Force | Out-Null}
            if (!(Test-Path "$PEInfo\json"))    {New-Item "$PEInfo\json" -ItemType Directory -Force | Out-Null}
            if (!(Test-Path "$PEInfo\logs"))    {New-Item "$PEInfo\logs" -ItemType Directory -Force | Out-Null}
            if (!(Test-Path "$PEInfo\xml"))     {New-Item "$PEInfo\xml" -ItemType Directory -Force | Out-Null}

            #===================================================================================================
            Write-Verbose '19.1.1 Export RegCurrentVersion'
            #===================================================================================================
            $RegCurrentVersion | Out-File "$Info\CurrentVersion.txt"
            $RegCurrentVersion | Out-File "$OSMediaPath\CurrentVersion.txt"
            $RegCurrentVersion | Out-File "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-CurrentVersion.txt"
            $RegCurrentVersion | Export-Clixml -Path "$Info\xml\CurrentVersion.xml"
            $RegCurrentVersion | Export-Clixml -Path "$Info\xml\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-CurrentVersion.xml"
            $RegCurrentVersion | ConvertTo-Json | Out-File "$Info\json\CurrentVersion.json"
            $RegCurrentVersion | ConvertTo-Json | Out-File "$Info\json\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-CurrentVersion.json"

            #===================================================================================================
            Write-Verbose '19.1.1 Start Transcript'
            #===================================================================================================
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            $ScriptName = $MyInvocation.MyCommand.Name
            $LogName = "$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-$ScriptName.log"
            Start-Transcript -Path (Join-Path "$Info\logs" $LogName)

            #===================================================================================================
            Write-Verbose '19.1.1 OSMedia Information'
            #===================================================================================================
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            Write-Host "OSMedia Information" -ForegroundColor Green
            Write-Host "-OSMediaName: $OSMediaName" -ForegroundColor Yellow
            Write-Host "-OSMediaPath: $OSMediaPath" -ForegroundColor Yellow
            Write-Host "-OS: $OS"
            Write-Host "-WinPE: $WinPE"
            Write-Host "-Info: $Info"
            Write-Host "-Logs: $Info\logs"

            #===================================================================================================
            Write-Verbose '19.1.1 Windows Image Information'
            #===================================================================================================
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            Write-Host "Windows Image Information" -ForegroundColor Green
            Write-Host "Source Path: $OSSourcePath"
            Write-Host "-Image File: $OSImagePath"
            Write-Host "-Image Index: $OSImageIndex"
            Write-Host "-Name: $OSImageName"
            Write-Host "-Description: $OSImageDescription"
            Write-Host "-Architecture: $OSArchitecture"
            Write-Host "-Edition: $OSEditionID"
            Write-Host "-Type: $OSInstallationType"
            Write-Host "-Languages: $OSLanguages"
            Write-Host "-Build: $OSBuild"
            Write-Host "-Version: $OSVersion"
            Write-Host "-SPBuild: $OSSPBuild"
            Write-Host "-SPLevel: $OSSPLevel"
            Write-Host "-Bootable: $OSImageBootable"
            Write-Host "-WimBoot: $OSWIMBoot"
            Write-Host "-Created Time: $OSCreatedTime"
            Write-Host "-Modified Time: $OSModifiedTime"
            Write-Host "-UBR: $UBR"

            #===================================================================================================
            Write-Verbose '19.1.1 Media: Copy Operating System'
            #===================================================================================================
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            Write-Host "Media: Copy Operating System to $OS" -ForegroundColor Green
            Copy-Item -Path "$OSSourcePath\*" -Destination "$OS" -Exclude "install.$InstallWimType" -Recurse -Force | Out-Null
            Get-ChildItem -Recurse -Path "$OS\*" | Set-ItemProperty -Name IsReadOnly -Value $false -ErrorAction SilentlyContinue | Out-Null

            if ($InstallWimType -eq "esd") {            
                $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Export-WindowsImage.log"
                Write-Verbose "$CurrentLog"
                Export-WindowsImage -SourceImagePath "$TempESD" -SourceIndex 1 -DestinationImagePath "$OS\sources\install.wim" -LogPath "$CurrentLog" | Out-Null
            } else {            
                $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Export-WindowsImage.log"
                Write-Verbose "$CurrentLog"
                Export-WindowsImage -SourceImagePath "$OSImagePath" -SourceIndex $OSImageIndex -DestinationImagePath "$OS\sources\install.wim" -LogPath "$CurrentLog" | Out-Null
            }

            #===================================================================================================
            Write-Verbose '19.1.1 Copy-OSBAutoExtraFiles'
            #===================================================================================================
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            Copy-OSBAutoExtraFiles -OSMediaPath "$OSMediaPath" -MountDirectory "$MountDirectory"

            #===================================================================================================
            Write-Verbose '19.1.1 Copy-OSBSessions'
            #===================================================================================================
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            Copy-OSBSessions -OSMediaPath "$OSMediaPath" -MountDirectory "$MountDirectory"

            #===================================================================================================
            Write-Verbose '19.1.1 Export-OSBInstallWimInventory'
            #===================================================================================================
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            Export-OSBInstallWimInventory -OSMediaPath "$OSMediaPath" -MountDirectory "$MountDirectory"

            #===================================================================================================
            Write-Verbose '19.1.1 Export-OSBWinPEWims'
            #===================================================================================================
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            Export-OSBWinPEWims -OSMediaPath "$OSMediaPath" -MountDirectory "$MountDirectory"

            #===================================================================================================
            Write-Verbose '19.1.1 Export-OSBWinPEInventory'
            #===================================================================================================
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            Export-OSBWinPEInventory -OSMediaPath "$OSMediaPath"

            #===================================================================================================
            Write-Verbose '19.1.1 Install.wim: Dismount'
            #===================================================================================================
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            Write-Host "Install.wim: Dismount from $MountDirectory" -ForegroundColor Green
            if ($OSImagePath -like "*.esd") {Remove-Item $TempESD -Force | Out-Null}

            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dismount-WindowsImage.log"
            Write-Verbose "$CurrentLog"
            Dismount-WindowsImage -Discard -Path "$MountDirectory" -LogPath "$CurrentLog" | Out-Null

            #===================================================================================================
            Write-Verbose '19.1.1 Install.wim: Export Configuration'
            #===================================================================================================
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            Write-Host "Install.wim: Export Configuration to $OSMediaPath\WindowsImage.txt" -ForegroundColor Green
            $GetWindowsImage = @()
            $GetWindowsImage = Get-WindowsImage -ImagePath "$OS\sources\install.wim" -Index 1 | Select-Object -Property *

            Write-Verbose "========== SPBuild: $($GetWindowsImage.Build).$($GetWindowsImage.SPBuild)"
            if ($OSVersion -like "6.1*") {
                Write-Verbose '========== Windows 6.1'
                $UBR = "$($GetWindowsImage.Build).$($GetWindowsImage.SPBuild)"
            }
            Write-Verbose "========== UBR: $UBR"

            $GetWindowsImage | Add-Member -Type NoteProperty -Name "UBR" -Value $UBR
            $GetWindowsImage | Out-File "$OSMediaPath\WindowsImage.txt"
            $GetWindowsImage | Out-File "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Get-WindowsImage.txt"
            $GetWindowsImage | Export-Clixml -Path "$Info\xml\Get-WindowsImage.xml"
            $GetWindowsImage | Export-Clixml -Path "$Info\xml\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Get-WindowsImage.xml"
            $GetWindowsImage | ConvertTo-Json | Out-File "$Info\json\Get-WindowsImage.json"
            $GetWindowsImage | ConvertTo-Json | Out-File "$Info\json\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Get-WindowsImage.json"
            (Get-Content "$OSMediaPath\WindowsImage.txt") | Where-Object {$_.Trim(" `t")} | Set-Content "$OSMediaPath\WindowsImage.txt"

            #===================================================================================================
            Write-Verbose '19.1.1 Install.wim: Export Image Content'
            #===================================================================================================
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            Write-Host "Install.wim: Export Image Content to $Info\Get-WindowsImageContent.txt" -ForegroundColor Green
            Get-WindowsImageContent -ImagePath "$OS\Sources\install.wim" -Index 1 | Out-File "$Info\Get-WindowsImageContent.txt"

            #===================================================================================================
            Write-Verbose '19.1.1 Export Variables.xml'
            #===================================================================================================
            Get-Variable | Select-Object -Property Name, Value | Export-Clixml "$Info\xml\Variables.xml"
            Get-Variable | Select-Object -Property Name, Value | ConvertTo-Json | Out-File "$Info\json\Variables.json"

            #===================================================================================================
            Write-Verbose '19.1.1 Show-OSBMediaInfo'
            #===================================================================================================
            if ($ShowMediaInfo.IsPresent) {
                Write-Host '========================================================================================' -ForegroundColor DarkGray
                Show-OSBMediaInfo -FullName $OSMediaPath
            }
            
            #===================================================================================================
            Write-Verbose '19.1.1 Stop Transcript'
            #===================================================================================================
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            Stop-Transcript

            #===================================================================================================
            Write-Verbose '19.1.1 New-OSBMediaISO.ps1'
            #===================================================================================================
            if ($CreateISO.IsPresent) {
                Write-Host '========================================================================================' -ForegroundColor DarkGray
                New-OSBMediaISO -FullName "$NewOSMediaPath"
            }

            #===================================================================================================
            Write-Verbose '19.1.1 Update-OSMedia'
            #===================================================================================================
            if ($UpdateOSMedia.IsPresent) {
                if ($OSMajorVersion -eq '10') {
                    Write-Verbose "Update-OSMedia -Name $OSMediaName -DownloadUpdates -Execute"
                    if ($CreateISO.IsPresent) {
                        Update-OSMedia -Name "$OSMediaName" -DownloadUpdates -Execute -CreateISO
                    } else {
                        Update-OSMedia -Name "$OSMediaName" -DownloadUpdates -Execute
                    }     
                } else  {
                    Write-Verbose "Update-OSMedia: Unsupported Operating System Version $OSMajorVersion"
                    Write-Warning "Update-OSMedia is not supported by this Operating System"
                }
            }
            #===================================================================================================
        }
    }

    END {
        #Write-Host '========================================================================================' -ForegroundColor DarkGray
        #Write-Host "$($MyInvocation.MyCommand.Name) END" -ForegroundColor Green
    }
}