Public/Update-OSMedia.ps1

<#
.SYNOPSIS
Applies Adobe, Component, Cumulative, Servicing Stack, and Setup Updates to Windows 7, Windows 10, Windows Server 2016, and Windows Server 2019 using Offline Servicing

.DESCRIPTION
Updates are gathered from the OSBuilder Update Catalogs

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

.PARAMETER Name
Enter the name of the existing OSMedia to update

.EXAMPLE
Update-OSMedia -Name 'Win10 Ent x64 1803 17134.345'

.PARAMETER DownloadUpdates
Automatically download the required updates if they are not present in the Content\Updates directory

.EXAMPLE
Update-OSMedia -Name 'Win10 Ent x64 1803 17134.345' -DownloadUpdates

.PARAMETER Execute
Execute the Update

.EXAMPLE
Update-OSMedia -Name 'Win10 Ent x64 1803 17134.345' -DownloadUpdates -Execute

.PARAMETER CreateISO
Creates an ISO of the Updated Media. Requires ADK oscdimg.exe

.EXAMPLE
Update-OSMedia -Name 'Win10 Ent x64 1803 17134.345' -DownloadUpdates -Execute -CreateISO

.PARAMETER PromptBeforeDismount
Adds a 'Press Enter to Continue' prompt before the Install.wim is dismounted

.PARAMETER PromptBeforeDismountWinPE
Adds a 'Press Enter to Continue' prompt before WinPE is dismounted
#>

function Update-OSMedia {
    [CmdletBinding(DefaultParameterSetName='Basic')]
    PARAM (

        [Parameter(ParameterSetName='Basic')]
        [Parameter(ParameterSetName='Advanced')]
        [switch]$DownloadUpdates,

        [Parameter(ParameterSetName='Basic')]
        [Parameter(ParameterSetName='Advanced')]
        [switch]$Execute,

        [Parameter(ValueFromPipelineByPropertyName)]
        [string[]]$Name,

        [Parameter(ParameterSetName='Basic')]
        [Parameter(ParameterSetName='Advanced')]
        [switch]$CreateISO,

        [Parameter(ParameterSetName='Basic')]
        [Parameter(ParameterSetName='Advanced')]
        [switch]$ShowMediaInfo,

        [Parameter(ParameterSetName='Advanced')]
        [switch]$PromptBeforeDismount,

        [Parameter(ParameterSetName='Advanced')]
        [switch]$PromptBeforeDismountWinPE,

        [Parameter(ParameterSetName='Repair')]
        [switch]$Repair
    )

    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-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 Update Catalogs'
        #===================================================================================================
        if (!(Test-Path $CatalogLocal)) {$DownloadUpdates = $true}
        if ($DownloadUpdates.IsPresent) {Get-OSBUpdate -UpdateCatalogs -HideDetails}

        #===================================================================================================
        Write-Verbose '19.1.1 Gather All Updates'
        #===================================================================================================
        $CatalogsXmls = @()
        $ImportCatalog = @()
        $AllUpdates = @()

        $CatalogsXmls = Get-ChildItem "$OSBuilderContent\Updates" Cat*.xml -Recurse
        foreach ($CatalogsXml in $CatalogsXmls) {
            $ImportCatalog = Import-Clixml -Path "$($CatalogsXml.FullName)"
            $AllUpdates += $ImportCatalog
        }
        $AllUpdates = $AllUpdates | Select-Object -Property *
    }

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

        #===================================================================================================
        # OSBuild
        Write-Verbose '19.1.8 Get-OSBuildTask'
        #===================================================================================================
        if ($MyInvocation.MyCommand.Name -eq 'New-OSBuild') {
            if ($ByTaskName) {
                $OSBuildTask = @()
                $OSBuildTask = Get-OSBuildTask | Where-Object {$_.TaskName -eq "$ByTaskName"}
            } else {
                $OSBuildTask = @()
                $OSBuildTask = Get-OSBuildTask | Out-GridView -PassThru -Title "OSBuild Tasks: Select one or more Tasks to execute and press OK (Cancel to Exit)"
            }
            if ($null -eq $OSBuildTask) {
                Write-Warning "OSBuild Task was not selected or found . . . Exiting!"
                Return
            }
        }

        #===================================================================================================
        # OSMedia
        Write-Verbose '19.1.3 Get-OSMedia'
        #===================================================================================================
        if ($MyInvocation.MyCommand.Name -eq 'Update-OSMedia') {
            if ($Name) {
                $OSMedia = foreach ($Item in $Name) {
                    Write-Verbose '========== Checking $Item'
                    $ObjectProperties = @{
                        Name = $Item
                    }
                    New-Object -TypeName PSObject -Property $ObjectProperties
                }
            } else {
                $OSMedia = @()
                $OSMedia = Get-OSMedia
                $OSMedia = $OSMedia | Where-Object {$_.MajorVersion -eq 10 -or $_.UBR -eq 7601.17514}
                if ($Repair.IsPresent) {
                    $OSMedia = $OSMedia | Where-Object {$_.Cumulative -eq 'Repair'}
                }
                $OSMedia = $OSMedia | Out-GridView -PassThru -Title "Select one or more OSMedia to Update (Cancel to Exit) and press OK"
            }
            if ($Repair.IsPresent) {$Execute = $true}
        }

        foreach ($Item in $OSMedia) {
            #===================================================================================================
            # OSBuild
            Write-Verbose '19.1.1 Read Task Contents'
            #===================================================================================================
            if ($MyInvocation.MyCommand.Name -eq 'New-OSBuild') {
                (Get-Content "$($Item.FullName)").replace('WinPEAddDaRT', 'WinPEDaRT') | Set-Content "$($Item.FullName)"
                $Task = Get-Content "$($Item.FullName)" | ConvertFrom-Json
                $TaskType = $($Task.TaskType)
                $TaskName = $($Task.TaskName)
                $TaskVersion = $($Task.TaskVersion)
                $CustomName = $($Task.CustomName)

                $TaskOSMFamily = $($Task.OSMFamily)
                $TaskOSMGuid = $($Task.OSMGuid)
                $OSMediaName = $($Task.Name)
                $OSMediaPath = "$OSBuilderOSMedia\$OSMediaName"

                $EnableNetFX3 = $($Task.EnableNetFX3)
                $StartLayoutXML = $($Task.StartLayoutXML)
                $UnattendXML = $($Task.UnattendXML)
                $WinPEAutoExtraFiles = $($Task.WinPEAutoExtraFiles)
                $WinPEDaRT = $($Task.WinPEDart)
                
                $ExtraFiles = $($Task.ExtraFiles)
                $Scripts = $($Task.Scripts)
                $Drivers = $($Task.Drivers)

                $Packages = $($Task.AddWindowsPackage)
                $RemovePackage = $($Task.RemoveWindowsPackage)
                $FeaturesOnDemand = $($Task.AddFeatureOnDemand)
                $EnableFeature = $($Task.EnableWindowsOptionalFeature)
                $DisableFeature = $($Task.DisableWindowsOptionalFeature)
                $RemoveAppx = $($Task.RemoveAppxProvisionedPackage)
                $RemoveCapability = $($Task.RemoveWindowsCapability)

                $WinPEDrivers = $($Task.WinPEDrivers)
                $WinPEScriptsPE = $($Task.WinPEScriptsPE)
                $WinPEScriptsRE = $($Task.WinPEScriptsRE)
                $WinPEScriptsSE = $($Task.WinPEScriptsSE)
                $WinPEExtraFilesPE = $($Task.WinPEExtraFilesPE)
                $WinPEExtraFilesRE = $($Task.WinPEExtraFilesRE)
                $WinPEExtraFilesSE = $($Task.WinPEExtraFilesSE)
                $WinPEADKPE = $($Task.WinPEADKPE)
                $WinPEADKRE = $($Task.WinPEADKRE)
                $WinPEADKSE = $($Task.WinPEADKSE)
                
                $SetAllIntl = $($Task.LangSetAllIntl)
                $SetInputLocale = $($Task.LangSetInputLocale)
                $SetSKUIntlDefaults = $($Task.LangSetSKUIntlDefaults)
                $SetSetupUILang = $($Task.LangSetSetupUILang)
                $SetSysLocale = $($Task.LangSetSysLocale)
                $SetUILang = $($Task.LangSetUILang)
                $SetUILangFallback = $($Task.LangSetUILangFallback)
                $SetUserLocale = $($Task.LangSetUserLocale)
                $LanguageFeatures = $($Task.LanguageFeature)
                $LanguageInterfacePacks = $($Task.LanguageInterfacePack)
                $LanguagePacks = $($Task.LanguagePack)
                
            }
        
            #===================================================================================================
            # OSBuild
            Write-Verbose '19.1.1 OSBuild Task Information'
            #===================================================================================================
            if ($MyInvocation.MyCommand.Name -eq 'New-OSBuild') {
                Write-Host '========================================================================================' -ForegroundColor DarkGray
                Write-Host "OSBuild Task Information" -ForegroundColor Green
                Write-Host "-TaskName: $TaskName"
                Write-Host "-TaskVersion: $TaskVersion"
                Write-Host "-TaskType: $TaskType"
                Write-Host "-OSMedia Name: $OSMediaName"
                Write-Host "-OSMedia Path: $OSMediaPath"
                Write-Host "-Custom Name: $CustomName"
                Write-Host "-Disable Feature:"
                if ($DisableFeature) {foreach ($item in $DisableFeature)            {Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-Drivers:"
                if ($Drivers) {foreach ($item in $Drivers)                          {Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-Enable Feature:"
                if ($EnableFeature) {foreach ($item in $EnableFeature)              {Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-Enable NetFx3: $EnableNetFX3"
                Write-Host "-Extra Files:"
                if ($ExtraFiles) {foreach ($item in $ExtraFiles)                    {Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-Features On Demand:"
                if ($FeaturesOnDemand) {foreach ($item in $FeaturesOnDemand)        {Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-Language Features:"
                if ($LanguageFeatures) {foreach ($item in $LanguageFeatures)        {Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-Language Interface Packs:"
                if ($LanguageInterfacePacks) {foreach ($item in $LanguageInterfacePacks) {Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-Language Packs:"
                if ($LanguagePacks) {foreach ($item in $LanguagePacks)              {Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-Packages:"
                if ($Packages) {foreach ($item in $Packages)                        {Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-Remove Appx:"
                if ($RemoveAppx) {foreach ($item in $RemoveAppx)                    {Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-Remove Capability:"
                if ($RemoveCapability) {foreach ($item in $RemoveCapability)        {Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-Remove Packages:"
                if ($RemovePackage) {foreach ($item in $RemovePackage)              {Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-Scripts:"
                if ($Scripts) {foreach ($item in $Scripts)                          {Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-SetAllIntl (Language): $SetAllIntl"
                Write-Host "-SetInputLocale (Language): $SetInputLocale"
                Write-Host "-SetSKUIntlDefaults (Language): $SetSKUIntlDefaults"
                Write-Host "-SetSetupUILang (Language): $SetSetupUILang"
                Write-Host "-SetSysLocale (Language): $SetSysLocale"
                Write-Host "-SetUILang (Language): $SetUILang"
                Write-Host "-SetUILangFallback (Language): $SetUILangFallback"
                Write-Host "-SetUserLocale (Language): $SetUserLocale"
                Write-Host "-Start Layout: $StartLayoutXML"
                Write-Host "-Unattend: $UnattendXML"
                Write-Host "-WinPE ADK Pkgs WinPE:"
                if ($WinPEADKPE) {foreach ($item in $WinPEADKPE)                    {Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-WinPE ADK Pkgs WinRE:"
                if ($WinPEADKRE) {foreach ($item in $WinPEADKRE)                    {Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-WinPE ADK Pkgs Setup:"
                if ($WinPEADKSE) {foreach ($item in $WinPEADKSE)              {Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-WinPE DaRT: $WinPEDaRT"
                Write-Host "-WinPE Drivers:"
                if ($WinPEDrivers) {foreach ($item in $WinPEDrivers)                {Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-WinPE Extra Files WinPE:"
                if ($WinPEExtraFilesPE) {foreach ($item in $WinPEExtraFilesPE)      {Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-WinPE Extra Files WinRE:"
                if ($WinPEExtraFilesRE) {foreach ($item in $WinPEExtraFilesRE)      {Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-WinPE Extra Files Setup:"
                if ($WinPEExtraFilesSE) {foreach ($item in $WinPEExtraFilesSE){Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-WinPE Scripts WinPE:"
                if ($WinPEScriptsPE) {foreach ($item in $WinPEScriptsPE)            {Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-WinPE Scripts WinRE:"
                if ($WinPEScriptsRE) {foreach ($item in $WinPEScriptsRE)            {Write-Host $item -ForegroundColor DarkGray}}
                Write-Host "-WinPE Scripts Setup:"
                if ($WinPEScriptsSE) {foreach ($item in $WinPEScriptsSE)      {Write-Host $item -ForegroundColor DarkGray}}
            }
        
            #===================================================================================================
            # OSBuild
            Write-Verbose '19.1.1 Validate Proper TaskVersion'
            #===================================================================================================
            if ($MyInvocation.MyCommand.Name -eq 'New-OSBuild') {
                if ([System.Version]$TaskVersion -lt [System.Version]"19.1.4.0") {
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Warning "OSBuilder Tasks need to be version 19.1.4.0 or newer"
                    Write-Warning "Recreate this Task using New-OSBuildTask or Repair-OSBuildTask"
                    Return
                }
            }

            #===================================================================================================
            # OSBuild
            Write-Verbose '19.1.8 Select Latest OSMedia'
            #===================================================================================================
            if ($MyInvocation.MyCommand.Name -eq 'New-OSBuild' -and (!($DontUseNewestMedia))) {
                $TaskOSMedia = Get-OSMedia | Where-Object {$_.OSMGuid -eq $TaskOSMGuid}
                if ($TaskOSMedia) {
                    $OSMediaName = $TaskOSMedia.Name
                    $OSMediaPath = $TaskOSMedia.FullName
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "Task Source OSMedia" -ForegroundColor Green
                    Write-Host "-OSMedia Name: $OSMediaName"
                    Write-Host "-OSMedia Path: $OSMediaPath"
                    Write-Host "-OSMedia Family: $TaskOSMFamily"
                    Write-Host "-OSMedia Guid: $TaskOSMGuid"
                }
                $LatestOSMedia = Get-OSMedia | Where-Object {$_.OSMFamily -eq $TaskOSMFamily} | Sort-Object UBR | Select-Object -Last 1
                if ($LatestOSMedia) {
                    $OSMediaName = $LatestOSMedia.Name
                    $OSMediaPath = $LatestOSMedia.FullName
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "Latest Source OSMedia" -ForegroundColor Green
                    Write-Host "-OSMedia Name: $OSMediaName"
                    Write-Host "-OSMedia Path: $OSMediaPath"
                    Write-Host "-OSMedia Family: $($LatestOSMedia.OSMFamily)"
                    Write-Host "-OSMedia Guid: $($LatestOSMedia.OSMGuid)"
                } else {
                    Write-Warning "Unable to find a matching OSMFamily $TaskOSMFamily"
                    Return
                }
            }
            
            #===================================================================================================
            # OSBuild
            Write-Verbose '19.1.1 Set Proper Paths'
            #===================================================================================================
            if ($MyInvocation.MyCommand.Name -eq 'Update-OSMedia') {
                $OSMediaPath = "$OSBuilderOSMedia\$($Item.Name)"
            }
            $OSImagePath = "$OSMediaPath\OS\sources\install.wim"

            if (!(Test-Path "$OSMediaPath\WindowsImage.txt")) {
                Write-Host '========================================================================================' -ForegroundColor DarkGray
                Write-Warning "$OSMediaPath is not a valid OSMedia Directory"
                Return
            }

            if (!(Test-Path "$OSImagePath")) {
                Write-Host '========================================================================================' -ForegroundColor DarkGray
                Write-Warning "$OSImagePath is not a valid Windows Image"
                Return
            }

            #===================================================================================================
            Write-Verbose '19.1.1 Get Windows Image Information'
            #===================================================================================================
            $OSImageIndex = 1
            $WindowsImage = Get-WindowsImage -ImagePath "$OSImagePath" -Index $OSImageIndex | Select-Object -Property *

            $OSImageName = $($WindowsImage.ImageName)
            $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 Source OSMedia Windows Image Information'
            #===================================================================================================
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            Write-Host "Source OSMedia Windows Image Information" -ForegroundColor Green
            Write-Host "-OSMedia Path: $OSMediaPath" -ForegroundColor Yellow
            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 "-Major Version: $OSMajorVersion"
            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-Verbose '19.1.1 Validate Registry CurrentVersion.xml'
            #===================================================================================================
            if (Test-Path "$OSMediaPath\info\xml\CurrentVersion.xml") {
                $RegCurrentVersion = Import-Clixml -Path "$OSMediaPath\info\xml\CurrentVersion.xml"
                $OSVersionNumber = $($RegCurrentVersion.ReleaseId)
                if ($OSVersionNumber -gt 1809) {
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Warning "OSBuilder does not currently support this version of Windows ... Check for an updated version"
                }
            }

            #===================================================================================================
            Write-Verbose '19.1.1 Set OSVersionNumber'
            #===================================================================================================
            if ($null -eq $OSVersionNumber) {
                if ($OSBuild -eq 7601) {$OSVersionNumber = 7601}
                if ($OSBuild -eq 10240) {$OSVersionNumber = 1507}
                if ($OSBuild -eq 14393) {$OSVersionNumber = 1607}
                if ($OSBuild -eq 15063) {$OSVersionNumber = 1703}
                if ($OSBuild -eq 16299) {$OSVersionNumber = 1709}
                if ($OSBuild -eq 17134) {$OSVersionNumber = 1803}
                if ($OSBuild -eq 17763) {$OSVersionNumber = 1809}
            }

            #===================================================================================================
            Write-Verbose '19.1.1 WorkingName and WorkingPath'
            #===================================================================================================
            if ($MyInvocation.MyCommand.Name -eq 'Update-OSMedia' -and $Repair.IsPresent) {
                $WorkingName = $($Item.Name)
                $WorkingPath = $OSMediaPath
            } elseif ($MyInvocation.MyCommand.Name -eq 'New-OSBuild') {
                $WorkingName = "build$((Get-Date).ToString('mmss'))"
                $WorkingPath = "$OSBuilderOSBuilds\$WorkingName"
            } else {
                $WorkingName = "build$((Get-Date).ToString('mmss'))"
                $WorkingPath = "$OSBuilderOSMedia\$WorkingName"
            }

            if (!($Repair.IsPresent)) {
                #===================================================================================================
                Write-Verbose '19.1.1 Remove Existing OSMedia'
                #===================================================================================================
                if (Test-Path $WorkingPath) {
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Warning "$WorkingPath will be replaced!"
                }

                #===================================================================================================
                # OSBuild
                Write-Verbose '19.1.11 Disable Windows 7 Updates'
                #===================================================================================================
                if ($MyInvocation.MyCommand.Name -eq 'New-OSBuild' -and $OSVersionNumber -eq 7601) {
                    $AllUpdates = @()
                }
                #===================================================================================================
                Write-Verbose '19.1.1 Setup Updates'
                #===================================================================================================
                $UpdateCatSetup = @()
                $UpdateCatSetup = $AllUpdates | Where-Object {$_.Category -eq 'Setup'}
                $UpdateCatSetup = $UpdateCatSetup | Where-Object {$_.KBTitle -like "*$OSVersionNumber*"}
                $UpdateCatSetup = $UpdateCatSetup | Where-Object {$_.KBTitle -like "*$OSArchitecture*"}
                if ($OSInstallationType -like "*Server*") {
                    $UpdateCatSetup = $UpdateCatSetup | Where-Object {$_.KBTitle -like "*Server*"}
                } else {
                    $UpdateCatSetup = $UpdateCatSetup | Where-Object {$_.KBTitle -notlike "*Server*"}
                }
                $UpdateCatSetup = $UpdateCatSetup | Sort-Object -Property DatePosted

                #===================================================================================================
                Write-Verbose '19.1.1 Servicing Stack Updates'
                #===================================================================================================
                $UpdateCatServicing = @()
                $UpdateCatServicing = $AllUpdates | Where-Object {$_.Category -eq 'Servicing'}
                $UpdateCatServicing = $UpdateCatServicing | Where-Object {$_.KBTitle -like "*$OSVersionNumber*"}
                $UpdateCatServicing = $UpdateCatServicing | Where-Object {$_.KBTitle -like "*$OSArchitecture*"}
                if ($OSInstallationType -like "*Server*") {
                    $UpdateCatServicing = $UpdateCatServicing | Where-Object {$_.KBTitle -like "*Server*"}
                } else {
                    $UpdateCatServicing = $UpdateCatServicing | Where-Object {$_.KBTitle -notlike "*Server*"}
                }
                $UpdateCatServicing = $UpdateCatServicing | Sort-Object -Property DatePosted

                #===================================================================================================
                Write-Verbose '19.1.1 Latest Cumulative Updates'
                #===================================================================================================
                $UpdateCatCumulative = @()
                $UpdateCatCumulative = $AllUpdates | Where-Object {$_.Category -eq 'Cumulative'}
                $UpdateCatCumulative = $UpdateCatCumulative | Where-Object {$_.KBTitle -like "*$OSVersionNumber*"}
                $UpdateCatCumulative = $UpdateCatCumulative | Where-Object {$_.KBTitle -like "*$OSArchitecture*"}
                if ($OSInstallationType -like "*Server*") {
                    $UpdateCatCumulative = $UpdateCatCumulative | Where-Object {$_.KBTitle -like "*Server*"}
                } else {
                    $UpdateCatCumulative = $UpdateCatCumulative | Where-Object {$_.KBTitle -notlike "*Server*"}
                }
                $UpdateCatCumulative = $UpdateCatCumulative | Sort-Object -Property DatePosted | Select-Object -Last 1
                #$UpdateCatCumulative = $UpdateCatCumulative | Sort-Object -Property DatePosted

                #===================================================================================================
                Write-Verbose '19.1.1 DotNet Framework Updates'
                #===================================================================================================
                $UpdateCatDotNet = @()
                $UpdateCatDotNet = $AllUpdates | Where-Object {$_.Category -eq 'DotNet'}
                $UpdateCatDotNet = $UpdateCatDotNet | Where-Object {$_.KBTitle -like "*$OSVersionNumber*"}
                $UpdateCatDotNet = $UpdateCatDotNet | Where-Object {$_.KBTitle -like "*$OSArchitecture*"}
                if ($OSInstallationType -like "*Server*") {
                    $UpdateCatDotNet = $UpdateCatDotNet | Where-Object {$_.KBTitle -like "*Server*"}
                } else {
                    $UpdateCatDotNet = $UpdateCatDotNet | Where-Object {$_.KBTitle -notlike "*Server*"}
                }
                $UpdateCatDotNet = $UpdateCatDotNet | Sort-Object -Property DatePosted | Select-Object -Last 1

                #===================================================================================================
                Write-Verbose '19.1.1 Adobe Flash Security Updates'
                #===================================================================================================
                $UpdateCatAdobe = @()
                $UpdateCatAdobe = $AllUpdates | Where-Object {$_.Category -eq 'Adobe'}
                $UpdateCatAdobe = $UpdateCatAdobe | Where-Object {$_.KBTitle -like "*$OSVersionNumber*"}
                $UpdateCatAdobe = $UpdateCatAdobe | Where-Object {$_.KBTitle -like "*$OSArchitecture*"}
                if ($OSInstallationType -like "*Server*") {
                    $UpdateCatAdobe = $UpdateCatAdobe | Where-Object {$_.KBTitle -like "*Server*"}
                } else {
                    $UpdateCatAdobe = $UpdateCatAdobe | Where-Object {$_.KBTitle -notlike "*Server*"}
                }
                $UpdateCatAdobe = $UpdateCatAdobe | Sort-Object -Property DatePosted | Select-Object -Last 1

                #===================================================================================================
                Write-Verbose '19.1.1 Component Updates'
                #===================================================================================================
                $UpdateCatComponent = @()
                $UpdateCatComponent = $AllUpdates | Where-Object {$_.Category -eq 'Component'}
                $UpdateCatComponent = $UpdateCatComponent | Where-Object {$_.KBTitle -like "*$OSVersionNumber*"}
                $UpdateCatComponent = $UpdateCatComponent | Where-Object {$_.KBTitle -like "*$OSArchitecture*"}
                if ($OSInstallationType -like "*Server*") {
                    $UpdateCatComponent = $UpdateCatComponent | Where-Object {$_.KBTitle -like "*Server*"}
                } else {
                    $UpdateCatComponent = $UpdateCatComponent | Where-Object {$_.KBTitle -notlike "*Server*"}
                }
                $UpdateCatComponent = $UpdateCatComponent | Sort-Object -Property DatePosted

                #===================================================================================================
                Write-Verbose '19.1.1 Windows 7'
                #===================================================================================================
                $CatalogWindows7 = @()
                $CatalogWindows7WinPE = @()
                if ($OSVersion -like "6.1.7601.*" -and $OSInstallationType -eq 'Client') {
                    $CatalogWindows7 = $AllUpdates | Where-Object {$_.Category -like "*Windows 7*"}
                    $CatalogWindows7 = $CatalogWindows7 | Where-Object {$_.KBTitle -like "*$OSArchitecture*"}
                    $CatalogWindows7 = $CatalogWindows7 | Sort-Object -Property DatePosted

                    $CatalogWindows7 = $CatalogWindows7 | Sort-Object -Property DatePosted

                    $CatalogWindows7WinPE = $CatalogWindows7 | Where-Object {$_.Severity -eq 'WinPE'}
                }

                #===================================================================================================
                Write-Verbose '19.1.1 Update Validation'
                #===================================================================================================
                Write-Host '========================================================================================' -ForegroundColor DarkGray
                Write-Host "Operating System Updates" -ForegroundColor Green

                foreach ($Update in $UpdateCatSetup) {
                    $(Get-ChildItem -Path $OSBuilderContent\Updates -Directory -Recurse | Where-Object {$_.Name -eq $($Update.KBTitle)}).FullName
                    if (!(Test-Path "$OSBuilderContent\Updates\*\$($Update.KBTitle)\$($Update.FileName)")) {
                        if ($DownloadUpdates.IsPresent) {
                            Write-Warning "Missing $($Update.KBTitle) ... Downloading"
                            Get-OSBUpdate -FilterKBTitle "$($Update.KBTitle)" -Download -HideDetails
                        } else {
                            Write-Warning "Missing $($Update.KBTitle) ... Execution will be Disabled"
                            $Execute = $false
                        }
                    }
                }

                foreach ($Update in $UpdateCatServicing) {
                    $(Get-ChildItem -Path $OSBuilderContent\Updates -Directory -Recurse | Where-Object {$_.Name -eq $($Update.KBTitle)}).FullName
                    if (!(Test-Path "$OSBuilderContent\Updates\*\$($Update.KBTitle)\$($Update.FileName)")) {
                        if ($DownloadUpdates.IsPresent) {
                            Write-Warning "Missing $($Update.KBTitle) ... Downloading"
                            Get-OSBUpdate -FilterKBTitle "$($Update.KBTitle)" -Download -HideDetails
                        } else {
                            Write-Warning "Missing $($Update.KBTitle) ... Execution will be Disabled"
                            $Execute = $false
                        }
                    }
                }

                foreach ($Update in $UpdateCatCumulative) {
                    $(Get-ChildItem -Path $OSBuilderContent\Updates -Directory -Recurse | Where-Object {$_.Name -eq $($Update.KBTitle)}).FullName
                    if (!(Test-Path "$OSBuilderContent\Updates\*\$($Update.KBTitle)\$($Update.FileName)")) {
                        if ($DownloadUpdates.IsPresent) {
                            Write-Warning "Missing $($Update.KBTitle) ... Downloading"
                            Get-OSBUpdate -FilterKBTitle "$($Update.KBTitle)" -Download -HideDetails
                        } else {
                            Write-Warning "Missing $($Update.KBTitle) ... Execution will be Disabled"
                            $Execute = $false
                        }
                    }
                }

                foreach ($Update in $UpdateCatDotNet) {
                    $(Get-ChildItem -Path $OSBuilderContent\Updates -Directory -Recurse | Where-Object {$_.Name -eq $($Update.KBTitle)}).FullName
                    if (!(Test-Path "$OSBuilderContent\Updates\*\$($Update.KBTitle)\$($Update.FileName)")) {
                        if ($DownloadUpdates.IsPresent) {
                            Write-Warning "Missing $($Update.KBTitle) ... Downloading"
                            Get-OSBUpdate -FilterKBTitle "$($Update.KBTitle)" -Download -HideDetails
                        } else {
                            Write-Warning "Missing $($Update.KBTitle) ... Execution will be Disabled"
                            $Execute = $false
                        }
                    }
                }

                foreach ($Update in $UpdateCatAdobe) {
                    $(Get-ChildItem -Path $OSBuilderContent\Updates -Directory -Recurse | Where-Object {$_.Name -eq $($Update.KBTitle)}).FullName
                    if (!(Test-Path "$OSBuilderContent\Updates\*\$($Update.KBTitle)\$($Update.FileName)")) {
                        if ($DownloadUpdates.IsPresent) {
                            Write-Warning "Missing $($Update.KBTitle) ... Downloading"
                            Get-OSBUpdate -FilterKBTitle "$($Update.KBTitle)" -Download -HideDetails
                        } else {
                            Write-Warning "Missing $($Update.KBTitle) ... Execution will be Disabled"
                            $Execute = $false
                        }
                    }
                }

                foreach ($Update in $UpdateCatComponent) {
                    $(Get-ChildItem -Path $OSBuilderContent\Updates -Directory -Recurse | Where-Object {$_.Name -eq $($Update.KBTitle)}).FullName
                    if (!(Test-Path "$OSBuilderContent\Updates\*\$($Update.KBTitle)\$($Update.FileName)")) {
                        if ($DownloadUpdates.IsPresent) {
                            Write-Warning "Missing $($Update.KBTitle) ... Downloading"
                            Get-OSBUpdate -FilterKBTitle "$($Update.KBTitle)" -Download -HideDetails
                        } else {
                            Write-Warning "Missing $($Update.KBTitle) ... Execution will be Disabled"
                            $Execute = $false
                        }
                    }
                }

                if ($OSVersion -like "6.1.7601.*") {
                    foreach ($Update in $CatalogWindows7) {
                        $(Get-ChildItem -Path $OSBuilderContent\Updates -Directory -Recurse | Where-Object {$_.Name -eq $($Update.KBTitle)}).FullName
                        if (!(Test-Path "$OSBuilderContent\Updates\*\$($Update.KBTitle)\$($Update.FileName)")) {
                            if ($DownloadUpdates.IsPresent) {
                                Write-Warning "Missing $($Update.KBTitle) ... Downloading"
                                Get-OSBUpdate -FilterKBTitle "$($Update.KBTitle)" -Download -HideDetails
                            } else {
                                Write-Warning "Missing $($Update.KBTitle) ... Execution will be Disabled"
                                $Execute = $false
                            }
                        }
                    }
                }
            }

            #===================================================================================================
            Write-Verbose '19.1.1 Execute'
            #===================================================================================================
            if ($Execute.IsPresent) {

                #===================================================================================================
                Write-Verbose '19.1.1 Remove Existing WorkingPath'
                #===================================================================================================
                if (!($Repair.IsPresent)) {
                    if (Test-Path $WorkingPath) {
                        Write-Host '========================================================================================' -ForegroundColor DarkGray
                        Remove-Item -Path "$WorkingPath" -Force -Recurse
                    }
                }

                #===================================================================================================
                Write-Verbose '19.1.1 Set Working Directories'
                #===================================================================================================
                $Info = Join-Path $WorkingPath '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 $WorkingPath 'OS'
                if (!(Test-Path "$OS"))             {New-Item "$OS" -ItemType Directory -Force | Out-Null}

                $WinPE = Join-Path $WorkingPath '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 Set Logs'
                #===================================================================================================
                $Logs = Join-Path $Info 'logs'
                $PELogs = Join-Path $PEInfo 'logs'

                #===================================================================================================
                Write-Verbose '19.1.1 Set WimTemp'
                #===================================================================================================
                $WimTemp = Join-Path $WorkingPath "WimTemp"
                if (!(Test-Path "$WimTemp"))        {New-Item "$WimTemp" -ItemType Directory -Force | Out-Null}

                #===================================================================================================
                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 Working Information'
                #===================================================================================================
                Write-Host '========================================================================================' -ForegroundColor DarkGray
                Write-Host "Working Information" -ForegroundColor Green
                Write-Host "-WorkingName: $WorkingName" -ForegroundColor Yellow
                Write-Host "-WorkingPath: $WorkingPath" -ForegroundColor Yellow
                Write-Host "-OS: $OS"
                Write-Host "-WinPE: $WinPE"
                Write-Host "-Info: $Info"
                Write-Host "-Logs: $Info\logs"

                #===================================================================================================
                Write-Verbose '19.1.1 Create Mount Directories'
                #===================================================================================================
                $MountDirectory = Join-Path $OSBuilderContent\Mount "os$((Get-Date).ToString('mmss'))"
                if ( ! (Test-Path "$MountDirectory")) {New-Item "$MountDirectory" -ItemType Directory -Force | Out-Null}
                $MountWinPE = Join-Path $OSBuilderContent\Mount "winpe$((Get-Date).ToString('mmss'))"
                if ( ! (Test-Path "$MountWinPE")) {New-Item "$MountWinPE" -ItemType Directory -Force | Out-Null}
                $MountWinSE = Join-Path $OSBuilderContent\Mount "setup$((Get-Date).ToString('mmss'))"
                if ( ! (Test-Path "$MountWinSE")) {New-Item "$MountWinSE" -ItemType Directory -Force | Out-Null}
                $MountWinRE = Join-Path $OSBuilderContent\Mount "winre$((Get-Date).ToString('mmss'))"
                if ( ! (Test-Path "$MountWinRE")) {New-Item "$MountWinRE" -ItemType Directory -Force | Out-Null}

                #===================================================================================================
                if ($Repair.IsPresent) {
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "Repair: Operating System at $WorkingPath" -ForegroundColor Green
                    Copy-Item -Path "$OSMediaPath\WinPE\*.wim" -Destination "$WimTemp" -Exclude boot.wim -Force | Out-Null
                    if (Test-Path "$WorkingPath\OS\sources\install.wim") {
                        Copy-Item -Path "$WorkingPath\OS\sources\install.wim" -Destination "$WimTemp\install.wim" -Force | Out-Null
                        Remove-Item -Path "$WorkingPath\OS\Sources\install.wim" -Force | Out-Null
                    }
                    if (Test-Path "$WorkingPath\OS\Sources\boot.wim") {Remove-Item -Path "$WorkingPath\OS\Sources\boot.wim" -Force | Out-Null}
                    if (Test-Path "$WorkingPath\WinPE\boot.wim") {Remove-Item -Path "$WorkingPath\WinPE\boot.wim" -Force | Out-Null}
                    if (Test-Path "$WorkingPath\WinPE\winpe.wim") {Remove-Item -Path "$WorkingPath\WinPE\winpe.wim" -Force | Out-Null}
                    if (Test-Path "$WorkingPath\WinPE\winre.wim") {Remove-Item -Path "$WorkingPath\WinPE\winre.wim" -Force | Out-Null}
                    if (Test-Path "$WorkingPath\WinPE\winse.wim") {Remove-Item -Path "$WorkingPath\WinPE\winse.wim" -Force | Out-Null}
                }
                
                #===================================================================================================
                Write-Verbose '19.1.1 Media: Copy Operating System'
                #===================================================================================================
                if (!($Repair.IsPresent)) {
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "Media: Copy Operating System to $WorkingPath" -ForegroundColor Green
                    Copy-Item -Path "$OSMediaPath\*" -Destination "$WorkingPath" -Exclude ('*.wim','*.iso') -Recurse -Force | Out-Null
                    if (Test-Path "$WorkingPath\ISO") {Remove-Item -Path "$WorkingPath\ISO" -Force -Recurse | Out-Null}
                    Copy-Item -Path "$OSMediaPath\OS\sources\install.wim" -Destination "$WimTemp\install.wim" -Force | Out-Null
                    Copy-Item -Path "$OSMediaPath\WinPE\*.wim" -Destination "$WimTemp" -Exclude boot.wim -Force | Out-Null
                }

                #===================================================================================================
                Write-Verbose '19.1.1 Media: Setup Update'
                #===================================================================================================
                if (!($Repair.IsPresent)) {
                    #Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "Media: Setup Update" -ForegroundColor Green
                    if (!($null -eq $UpdateCatSetup)) {
                        foreach ($Update in $UpdateCatSetup) {
                            $UpdateCatSetup = $(Get-ChildItem -Path $OSBuilderContent\Updates -File -Recurse | Where-Object {$_.Name -eq $($Update.FileName)}).FullName
                            $UpdateCatSetup
                            if (Test-Path "$UpdateCatSetup") {
                                expand.exe "$UpdateCatSetup" -F:*.* "$OS\Sources"
                            } else {
                                Write-Warning "Not Found: $UpdateCatSetup ... Skipping Update"
                            }
                        }
                    }
                }

                #===================================================================================================
                Write-Verbose '19.1.1 Mount WinPE'
                #===================================================================================================
                Write-Host '========================================================================================' -ForegroundColor DarkGray
                Mount-OSBWinPE -OSMediaPath "$WorkingPath" -MountWinPE "$MountWinPE" -MountWinRE "$MountWinRE" -MountWinSE "$MountWinSE"

                #===================================================================================================
                Write-Verbose '19.1.1 WinPE: Servicing Stack Update'
                #===================================================================================================
                if (!($Repair.IsPresent)) {
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "WinPE: (SSU) Servicing Stack Update" -ForegroundColor Green

                    if (!($null -eq $UpdateCatServicing)) {
                        foreach ($Update in $UpdateCatServicing) {
                            $UpdateSSU = $(Get-ChildItem -Path $OSBuilderContent\Updates -Directory -Recurse | Where-Object {$_.Name -eq $($Update.KBTitle)}).FullName
                            if (Test-Path "$UpdateSSU") {
                                Write-Host "$UpdateSSU" -ForegroundColor DarkGray

                                if (Get-WindowsPackage -Path "$MountWinPE" | Where-Object {$_.PackageName -like "*$($Update.KBNumber)*"}) {
                                    Write-Warning "WinPE.wim KB$($Update.KBNumber) is already installed"
                                } else {
                                    $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-UpdateServicing-KB$($Update.KBNumber)-WinPE.log"
                                    Write-Verbose "$CurrentLog"
                                    Add-WindowsPackage -Path "$MountWinPE" -PackagePath "$UpdateSSU" -LogPath "$CurrentLog" | Out-Null
                                }

                                if (Get-WindowsPackage -Path "$MountWinRE" | Where-Object {$_.PackageName -like "*$($Update.KBNumber)*"}) {
                                    Write-Warning "WinRE.wim KB$($Update.KBNumber) is already installed"
                                } else {
                                    $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-UpdateServicing-KB$($Update.KBNumber)-WinRE.log"
                                    Write-Verbose "$CurrentLog"
                                    Add-WindowsPackage -Path "$MountWinRE" -PackagePath "$UpdateSSU" -LogPath "$CurrentLog" | Out-Null
                                }

                                if (Get-WindowsPackage -Path "$MountWinSE" | Where-Object {$_.PackageName -like "*$($Update.KBNumber)*"}) {
                                    Write-Warning "WinSE.wim KB$($Update.KBNumber) is already installed"
                                } else {
                                    $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-UpdateServicing-KB$($Update.KBNumber)-WinSE.log"
                                    Write-Verbose "$CurrentLog"
                                    Add-WindowsPackage -Path "$MountWinSE" -PackagePath "$UpdateSSU" -LogPath "$CurrentLog" | Out-Null
                                }
                            } else {
                                Write-Warning "Not Found: $UpdateSSU ... Skipping Update"
                            }
                        }
                    }
                }
                
                if ($MyInvocation.MyCommand.Name -eq 'New-OSBuild') {
                    #===================================================================================================
                    Write-Verbose '19.1.1 WinPE WIM ADK Optional Components'
                    # OSBuild Only
                    #===================================================================================================
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "WinPE: WinPE.wim ADK Optional Components" -ForegroundColor Green
                    if ([string]::IsNullOrEmpty($WinPEADKPE) -or [string]::IsNullOrWhiteSpace($WinPEADKPE)) {
                        # Do Nothing
                    } else {
                        foreach ($PackagePath in $WinPEADKPE) {
                            if ($PackagePath -like "*WinPE-NetFx*") {
                                Write-Host "$OSBuilderContent\$PackagePath" -ForegroundColor DarkGray
                                Add-WindowsPackage -PackagePath "$OSBuilderContent\$PackagePath" -Path "$MountWinPE" -LogPath "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-WindowsPackage-WinPE.log" | Out-Null
                            }
                        }
                        $WinPEADKPE = $WinPEADKPE | Where-Object {$_.Name -notlike "*WinPE-NetFx*"}
                        foreach ($PackagePath in $WinPEADKPE) {
                            if ($PackagePath -like "*WinPE-PowerShell*") {
                                Write-Host "$OSBuilderContent\$PackagePath" -ForegroundColor DarkGray
                                Add-WindowsPackage -PackagePath "$OSBuilderContent\$PackagePath" -Path "$MountWinPE" -LogPath "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-WindowsPackage-WinPE.log" | Out-Null
                            }
                        }
                        $WinPEADKPE = $WinPEADKPE | Where-Object {$_.Name -notlike "*WinPE-PowerShell*"}
                        foreach ($PackagePath in $WinPEADKPE) {
                            Write-Host "$OSBuilderContent\$PackagePath" -ForegroundColor DarkGray
                            if ($OSMajorVersion -eq 6) {
                                dism /Image:"$MountWinPE" /Add-Package /PackagePath:"$OSBuilderContent\$PackagePath" /LogPath:"$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-DISM-Add-WindowsPackage-WinPE.log"
                            } else {
                                Add-WindowsPackage -PackagePath "$OSBuilderContent\$PackagePath" -Path "$MountWinPE" -LogPath "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-WindowsPackage-WinPE.log" | Out-Null
                            }
                        }
                    }
                    #===================================================================================================
                    Write-Verbose '19.1.1 WinRE WIM ADK Optional Components'
                    # OSBuild Only
                    #===================================================================================================
                    #Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "WinPE: WinRE.wim ADK Optional Components" -ForegroundColor Green
                    if ([string]::IsNullOrEmpty($WinPEADKRE) -or [string]::IsNullOrWhiteSpace($WinPEADKRE)) {
                        # Do Nothing
                    } else {
                        foreach ($PackagePath in $WinPEADKRE) {
                            if ($PackagePath -like "*WinPE-NetFx*") {
                                Write-Host "$OSBuilderContent\$PackagePath" -ForegroundColor DarkGray
                                Add-WindowsPackage -PackagePath "$OSBuilderContent\$PackagePath" -Path "$MountWinRE" -LogPath "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-WindowsPackage-WinRE.log" | Out-Null
                            }
                        }
                        $WinPEADKRE = $WinPEADKRE | Where-Object {$_.Name -notlike "*WinPE-NetFx*"}
                        foreach ($PackagePath in $WinPEADKRE) {
                            if ($PackagePath -like "*WinPE-PowerShell*") {
                                Write-Host "$OSBuilderContent\$PackagePath" -ForegroundColor DarkGray
                                Add-WindowsPackage -PackagePath "$OSBuilderContent\$PackagePath" -Path "$MountWinRE" -LogPath "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-WindowsPackage-WinRE.log" | Out-Null
                            }
                        }
                        $WinPEADKRE = $WinPEADKRE | Where-Object {$_.Name -notlike "*WinPE-PowerShell*"}
                        foreach ($PackagePath in $WinPEADKRE) {
                            Write-Host "$OSBuilderContent\$PackagePath" -ForegroundColor DarkGray
                            if ($OSMajorVersion -eq 6) {
                                dism /Image:"$MountWinRE" /Add-Package /PackagePath:"$OSBuilderContent\$PackagePath" /LogPath:"$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-DISM-Add-WindowsPackage-WinRE.log"
                            } else {
                                Add-WindowsPackage -PackagePath "$OSBuilderContent\$PackagePath" -Path "$MountWinRE" -LogPath "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-WindowsPackage-WinRE.log" | Out-Null
                            }
                        }
                    }
                    #===================================================================================================
                    Write-Verbose '19.1.1 Setup WIM ADK Optional Components'
                    # OSBuild Only
                    #===================================================================================================
                    #Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "WinPE: WinSE.wim ADK Optional Components" -ForegroundColor Green
                    if ([string]::IsNullOrEmpty($WinPEADKSE) -or [string]::IsNullOrWhiteSpace($WinPEADKSE)) {
                        # Do Nothing
                    } else {
                        foreach ($PackagePath in $WinPEADKSE) {
                            if ($PackagePath -like "*WinPE-NetFx*") {
                                Write-Host "$OSBuilderContent\$PackagePath" -ForegroundColor DarkGray
                                Add-WindowsPackage -PackagePath "$OSBuilderContent\$PackagePath" -Path "$MountWinSE" -LogPath "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-WindowsPackage-WinSE.log" | Out-Null
                            }
                        }
                        $WinPEADKSE = $WinPEADKSE | Where-Object {$_.Name -notlike "*WinPE-NetFx*"}
                        foreach ($PackagePath in $WinPEADKSE) {
                            if ($PackagePath -like "*WinPE-PowerShell*") {
                                Write-Host "$OSBuilderContent\$PackagePath" -ForegroundColor DarkGray
                                Add-WindowsPackage -PackagePath "$OSBuilderContent\$PackagePath" -Path "$MountWinSE" -LogPath "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-WindowsPackage-WinSE.log" | Out-Null
                            }
                        }
                        $WinPEADKSE = $WinPEADKSE | Where-Object {$_.Name -notlike "*WinPE-PowerShell*"}
                        foreach ($PackagePath in $WinPEADKSE) {
                            Write-Host "$OSBuilderContent\$PackagePath" -ForegroundColor DarkGray
                            if ($OSMajorVersion -eq 6) {
                                dism /Image:"$MountWinSE" /Add-Package /PackagePath:"$OSBuilderContent\$PackagePath" /LogPath:"$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-DISM-Add-WindowsPackage-WinSE.log"
                            } else {
                                Add-WindowsPackage -PackagePath "$OSBuilderContent\$PackagePath" -Path "$MountWinSE" -LogPath "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-WindowsPackage-WinSE.log" | Out-Null
                            }
                        }
                    }
                }

                #===================================================================================================
                Write-Verbose '19.1.1 WinPE: (LCU) Latest Cumulative Update'
                #===================================================================================================
                if (!($Repair.IsPresent)) {
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "WinPE: (LCU) Latest Cumulative Update" -ForegroundColor Green
                    if (!($null -eq $UpdateCatCumulative)) {
                        foreach ($Update in $UpdateCatCumulative) {
                            $UpdateLCU = $(Get-ChildItem -Path $OSBuilderContent\Updates -Directory -Recurse | Where-Object {$_.Name -eq $($Update.KBTitle)}).FullName
                            if (Test-Path "$UpdateLCU") {
                                Write-Host "$UpdateLCU" -ForegroundColor DarkGray

                                #if (Get-WindowsPackage -Path "$MountWinPE" | Where-Object {$_.PackageName -like "*$($Update.KBNumber)*"}) {}
                                $SessionsXmlWinPE = "$MountWinPE\Windows\Servicing\Sessions\Sessions.xml"
                                if (Test-Path $SessionsXmlWinPE) {
                                    [xml]$XmlDocument = Get-Content -Path $SessionsXmlWinPE
                                    if ($XmlDocument.Sessions.Session.Tasks.Phase.package | Where-Object {$_.Name -like "*$($Update.KBNumber)*" -and $_.targetState -eq 'Installed'}) {
                                        Write-Warning "WinPE.wim KB$($Update.KBNumber) is already installed"
                                    } else {
                                        $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-UpdateCumulative-KB$($Update.KBNumber)-WinPE.log"
                                        Write-Verbose "$CurrentLog"
                                        Add-WindowsPackage -Path "$MountWinPE" -PackagePath "$UpdateLCU" -LogPath "$CurrentLog" | Out-Null
                                        if (!($OSVersion -like "6.1.7601.*")) {
                                            $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-DismCleanupImage-WinPE.log"
                                            Write-Verbose "$CurrentLog"
                                            Dism /Image:"$MountWinPE" /Cleanup-Image /StartComponentCleanup /ResetBase /LogPath:"$CurrentLog"
                                        }
                                    }
                                } else {
                                    $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-UpdateCumulative-KB$($Update.KBNumber)-WinPE.log"
                                    Write-Verbose "$CurrentLog"
                                    Add-WindowsPackage -Path "$MountWinPE" -PackagePath "$UpdateLCU" -LogPath "$CurrentLog" | Out-Null
                                    if (!($OSVersion -like "6.1.7601.*")) {
                                        $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-DismCleanupImage-WinPE.log"
                                        Write-Verbose "$CurrentLog"
                                        Dism /Image:"$MountWinPE" /Cleanup-Image /StartComponentCleanup /ResetBase /LogPath:"$CurrentLog"
                                    }
                                }

                                #if (Get-WindowsPackage -Path "$MountWinRE" | Where-Object {$_.PackageName -like "*$($Update.KBNumber)*"}) {}
                                $SessionsXmlWinRE = "$MountWinRE\Windows\Servicing\Sessions\Sessions.xml"
                                if (Test-Path $SessionsXmlWinRE) {
                                    [xml]$XmlDocument = Get-Content -Path $SessionsXmlWinRE
                                    if ($XmlDocument.Sessions.Session.Tasks.Phase.package | Where-Object {$_.Name -like "*$($Update.KBNumber)*" -and $_.targetState -eq 'Installed'}) {
                                        Write-Warning "WinRE.wim KB$($Update.KBNumber) is already installed"
                                    } else {
                                        $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-UpdateCumulative-KB$($Update.KBNumber)-WinRE.log"
                                        Write-Verbose "$CurrentLog"
                                        Add-WindowsPackage -Path "$MountWinRE" -PackagePath "$UpdateLCU" -LogPath "$CurrentLog" | Out-Null
                                        if (!($OSVersion -like "6.1.7601.*")) {
                                            $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-DismCleanupImage-WinRE.log"
                                            Write-Verbose "$CurrentLog"
                                            Dism /Image:"$MountWinRE" /Cleanup-Image /StartComponentCleanup /ResetBase /LogPath:"$CurrentLog"
                                        }
                                    }
                                } else {
                                    $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-UpdateCumulative-KB$($Update.KBNumber)-WinRE.log"
                                    Write-Verbose "$CurrentLog"
                                    Add-WindowsPackage -Path "$MountWinRE" -PackagePath "$UpdateLCU" -LogPath "$CurrentLog" | Out-Null
                                    if (!($OSVersion -like "6.1.7601.*")) {
                                        $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-DismCleanupImage-WinRE.log"
                                        Write-Verbose "$CurrentLog"
                                        Dism /Image:"$MountWinRE" /Cleanup-Image /StartComponentCleanup /ResetBase /LogPath:"$CurrentLog"
                                    }
                                }

                                #if (Get-WindowsPackage -Path "$MountWinSE" | Where-Object {$_.PackageName -like "*$($Update.KBNumber)*"}) {}
                                $SessionsXmlSetup = "$MountWinSE\Windows\Servicing\Sessions\Sessions.xml"
                                if (Test-Path $SessionsXmlSetup) {
                                    [xml]$XmlDocument = Get-Content -Path $SessionsXmlSetup
                                    if ($XmlDocument.Sessions.Session.Tasks.Phase.package | Where-Object {$_.Name -like "*$($Update.KBNumber)*" -and $_.targetState -eq 'Installed'}) {
                                        Write-Warning "WinSE.wim KB$($Update.KBNumber) is already installed"
                                    } else {
                                        $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-UpdateCumulative-KB$($Update.KBNumber)-WinSE.log"
                                        Write-Verbose "$CurrentLog"
                                        Add-WindowsPackage -Path "$MountWinSE" -PackagePath "$UpdateLCU" -LogPath "$CurrentLog" | Out-Null
                                        if (!($OSVersion -like "6.1.7601.*")) {
                                            $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-DismCleanupImage-WinSE.log"
                                            Write-Verbose "$CurrentLog"
                                            Dism /Image:"$MountWinSE" /Cleanup-Image /StartComponentCleanup /ResetBase /LogPath:"$CurrentLog"
                                        }
                                    }
                                } else {
                                    $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-UpdateCumulative-KB$($Update.KBNumber)-WinSE.log"
                                    Write-Verbose "$CurrentLog"
                                    Add-WindowsPackage -Path "$MountWinSE" -PackagePath "$UpdateLCU" -LogPath "$CurrentLog" | Out-Null
                                    if (!($OSVersion -like "6.1.7601.*")) {
                                        $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-DismCleanupImage-WinSE.log"
                                        Write-Verbose "$CurrentLog"
                                        Dism /Image:"$MountWinSE" /Cleanup-Image /StartComponentCleanup /ResetBase /LogPath:"$CurrentLog"
                                    }
                                }
                            } else {
                                Write-Warning "Not Found: $UpdateLCU"
                            }
                        }
                    }
                }

                #===================================================================================================
                Write-Verbose '19.1.1 WinPE Windows 7 Updates'
                #===================================================================================================
                if (!($Repair.IsPresent)) {
                    if ($OSVersion -like "6.1.7601.*") {
                        Write-Host '========================================================================================' -ForegroundColor DarkGray
                        Write-Host "WinPE Windows 7 Updates" -ForegroundColor Green
                        if (!($null -eq $CatalogWindows7WinPE)) {
                            foreach ($Update in $CatalogWindows7WinPE) {
                                $UpdateWin7WinPE = $(Get-ChildItem -Path $OSBuilderContent\Updates -Directory -Recurse | Where-Object {$_.Name -eq $($Update.KBTitle)}).FullName
                                if (Test-Path "$UpdateWin7WinPE") {
                                    Write-Host "$UpdateWin7WinPE" -ForegroundColor DarkGray

                                    if (Get-WindowsPackage -Path "$MountWinSE" | Where-Object {$_.PackageName -like "*$($Update.KBNumber)*"}) {
                                        Write-Warning "WinSE.wim KB$($Update.KBNumber) is already installed"
                                    } else {
                                        $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-UpdateWin7WinPE-KB$($Update.KBNumber)-WinSE.log"
                                        Write-Verbose "$CurrentLog"
                                        Add-WindowsPackage -Path "$MountWinSE" -PackagePath "$UpdateWin7WinPE" -LogPath "$CurrentLog" | Out-Null
                                    }

                                    if (Get-WindowsPackage -Path "$MountWinPE" | Where-Object {$_.PackageName -like "*$($Update.KBNumber)*"}) {
                                        Write-Warning "WinPE.wim KB$($Update.KBNumber) is already installed"
                                    } else {
                                        $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-UpdateWin7WinPE-KB$($Update.KBNumber)-WinPE.log"
                                        Write-Verbose "$CurrentLog"
                                        Add-WindowsPackage -Path "$MountWinPE" -PackagePath "$UpdateWin7WinPE" -LogPath "$CurrentLog" | Out-Null
                                    }

                                    if (Get-WindowsPackage -Path "$MountWinRE" | Where-Object {$_.PackageName -like "*$($Update.KBNumber)*"}) {
                                        Write-Warning "WinRE.wim KB$($Update.KBNumber) is already installed"
                                    } else {
                                        $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-UpdateWin7WinPE-KB$($Update.KBNumber)-WinRE.log"
                                        Write-Verbose "$CurrentLog"
                                        Add-WindowsPackage -Path "$MountWinRE" -PackagePath "$UpdateWin7WinPE" -LogPath "$CurrentLog" | Out-Null
                                    }
                                } else {
                                    Write-Warning "Not Found: $UpdateWin7WinPE ... Skipping Update"
                                }
                            }
                        }
                    }
                }

                if ($MyInvocation.MyCommand.Name -eq 'New-OSBuild') {
                    #===================================================================================================
                    Write-Verbose '19.1.1 WinPE DaRT'
                    # OSBuild Only
                    #===================================================================================================
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "WinPE: Microsoft DaRT" -ForegroundColor Green
                    if ($WinPEDaRT) {
                        if ([string]::IsNullOrEmpty($WinPEDaRT) -or [string]::IsNullOrWhiteSpace($WinPEDaRT)) {Write-Warning "Skipping WinPE DaRT"}
                        elseif (Test-Path "$OSBuilderContent\$WinPEDaRT") {
                            #===================================================================================================
                            Write-Host "WinPE: WinPE.wim Microsoft DaRT $OSBuilderContent\$WinPEDaRT" -ForegroundColor Green
                            expand.exe "$OSBuilderContent\$WinPEDaRT" -F:*.* "$MountWinPE"
                            if (Test-Path "$MountWinPE\Windows\System32\winpeshl.ini") {Remove-Item -Path "$MountWinPE\Windows\System32\winpeshl.ini" -Force}
                            #===================================================================================================
                            Write-Host "WinPE: WinRE.wim Microsoft DaRT $OSBuilderContent\$WinPEDaRT" -ForegroundColor Green
                            expand.exe "$OSBuilderContent\$WinPEDaRT" -F:*.* "$MountWinRE"
                            (Get-Content "$MountWinRE\Windows\System32\winpeshl.ini") | ForEach-Object {$_ -replace '-prompt','-network'} | Out-File "$MountWinRE\Windows\System32\winpeshl.ini"
                            #===================================================================================================
                            Write-Host "WinPE: WinSE.wim Microsoft DaRT $OSBuilderContent\$WinPEDaRT" -ForegroundColor Green
                            expand.exe "$OSBuilderContent\$WinPEDaRT" -F:*.* "$MountWinSE"
                            if (Test-Path "$MountWinSE\Windows\System32\winpeshl.ini") {Remove-Item -Path "$MountWinSE\Windows\System32\winpeshl.ini" -Force}
                            
                            if (Test-Path $(Join-Path $(Split-Path "$OSBuilderContent\$WinPEDart") 'DartConfig.dat')) {
                                Copy-Item -Path $(Join-Path $(Split-Path "$OSBuilderContent\$WinPEDart") 'DartConfig.dat') -Destination "$MountWinPE\Windows\System32\DartConfig.dat" -Force | Out-Null
                                Copy-Item -Path $(Join-Path $(Split-Path "$OSBuilderContent\$WinPEDart") 'DartConfig.dat') -Destination "$MountWinSE\Windows\System32\DartConfig.dat" -Force | Out-Null
                                Copy-Item -Path $(Join-Path $(Split-Path "$OSBuilderContent\$WinPEDart") 'DartConfig.dat') -Destination "$MountWinRE\Windows\System32\DartConfig.dat" -Force | Out-Null
                            } elseif (Test-Path $(Join-Path $(Split-Path $WinPEDart) 'DartConfig8.dat')) {
                                Copy-Item -Path $(Join-Path $(Split-Path "$OSBuilderContent\$WinPEDart") 'DartConfig8.dat') -Destination "$MountWinSE\Windows\System32\DartConfig.dat" -Force | Out-Null
                                Copy-Item -Path $(Join-Path $(Split-Path "$OSBuilderContent\$WinPEDart") 'DartConfig8.dat') -Destination "$MountWinPE\Windows\System32\DartConfig.dat" -Force | Out-Null
                                Copy-Item -Path $(Join-Path $(Split-Path "$OSBuilderContent\$WinPEDart") 'DartConfig8.dat') -Destination "$MountWinRE\Windows\System32\DartConfig.dat" -Force | Out-Null
                            }
                            #===================================================================================================
                        } else {Write-Warning "WinPE DaRT do not exist in $OSBuilderContent\$WinPEDart"}
                    }
                    
                    #===================================================================================================
                    Write-Verbose '19.1.1 Extra Files'
                    # OSBuild Only
                    #===================================================================================================
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "WinPE: WinPE.wim Extra Files" -ForegroundColor Green
                    foreach ($ExtraFile in $WinPEExtraFilesPE) {robocopy "$OSBuilderContent\$ExtraFile" "$MountWinPE" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ExtraFiles-WinPE.log" | Out-Null}
                    #Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "WinPE: WinRE.wim Extra Files" -ForegroundColor Green
                    foreach ($ExtraFile in $WinPEExtraFilesRE) {robocopy "$OSBuilderContent\$ExtraFile" "$MountWinRE" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ExtraFiles-WinRE.log" | Out-Null}
                    #Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "WinPE: WinSE.wim Extra Files" -ForegroundColor Green
                    foreach ($ExtraFile in $WinPEExtraFilesSE) {robocopy "$OSBuilderContent\$ExtraFile" "$MountWinSE" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ExtraFiles-WinSE.log" | Out-Null}
                                        
                    #===================================================================================================
                    Write-Verbose '19.1.9 Auto Extra Files'
                    # OSBuild Only
                    #===================================================================================================
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "WinPE: WinPE.wim Auto ExtraFiles" -ForegroundColor Green
                    if ($WinPEAutoExtraFiles -eq $true) {
                        robocopy "$WinPE\AutoExtraFiles" "$MountWinPE" *.* /e /ndl /xf bcp47*.dll /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-AutoExtraFiles-WinPE.log" | Out-Null
                    }
                    Write-Host "WinPE: WinRE.wim Auto ExtraFiles" -ForegroundColor Green
                    if ($WinPEAutoExtraFiles -eq $true) {
                        robocopy "$WinPE\AutoExtraFiles" "$MountWinRE" *.* /e /ndl /xf bcp47*.dll /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-AutoExtraFiles-WinRE.log" | Out-Null
                    }
                    Write-Host "WinPE: WinSE.wim Auto ExtraFiles" -ForegroundColor Green
                    if ($WinPEAutoExtraFiles -eq $true) {
                        robocopy "$WinPE\AutoExtraFiles" "$MountWinSE" *.* /e /ndl /xf bcp47*.dll /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-AutoExtraFiles-WinSE.log" | Out-Null
                    }

                    #===================================================================================================
                    Write-Verbose '19.1.1 Drivers'
                    # OSBuild Only
                    #===================================================================================================
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "WinPE: WinPE.wim Drivers" -ForegroundColor Green
                    foreach ($WinPEDriver in $WinPEDrivers) {
                        Write-Host "$OSBuilderContent\$WinPEDriver" -ForegroundColor DarkGray
                        if ($OSMajorVersion -eq 6) {
                            dism /Image:"$MountWinPE" /Add-Driver /Driver:"$OSBuilderContent\$WinPEDriver" /Recurse /ForceUnsigned /LogPath:"$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-DISM-Add-Driver-WinPE.log"
                        } else {
                            Add-WindowsDriver -Path "$MountWinPE" -Driver "$OSBuilderContent\$WinPEDriver" -Recurse -ForceUnsigned -LogPath "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-WindowsDriver-WinPE.log" | Out-Null
                        }
                    }
                    #Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "WinPE: WinRE.wim Drivers" -ForegroundColor Green
                    foreach ($WinPEDriver in $WinPEDrivers) {
                        Write-Host "$OSBuilderContent\$WinPEDriver" -ForegroundColor DarkGray
                        if ($OSMajorVersion -eq 6) {
                            dism /Image:"$MountWinRE" /Add-Driver /Driver:"$OSBuilderContent\$WinPEDriver" /Recurse /ForceUnsigned /LogPath:"$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-DISM-Add-Driver-WinRE.log"
                        } else {
                            Add-WindowsDriver -Path "$MountWinRE" -Driver "$OSBuilderContent\$WinPEDriver" -Recurse -ForceUnsigned -LogPath "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-WindowsDriver-WinRE.log" | Out-Null
                        }
                    }
                    #Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "WinPE: WinSE.wim Drivers" -ForegroundColor Green
                    foreach ($WinPEDriver in $WinPEDrivers) {
                        Write-Host "$OSBuilderContent\$WinPEDriver" -ForegroundColor DarkGray
                        if ($OSMajorVersion -eq 6) {
                            dism /Image:"$MountWinSE" /Add-Driver /Driver:"$OSBuilderContent\$WinPEDriver" /Recurse /ForceUnsigned /LogPath:"$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-DISM-Add-Driver-WinSE.log"
                        } else {
                            Add-WindowsDriver -Path "$MountWinSE" -Driver "$OSBuilderContent\$WinPEDriver" -Recurse -ForceUnsigned -LogPath "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-WindowsDriver-WinSE.log" | Out-Null
                        }
                    }
                    
                    #===================================================================================================
                    # Write-Verbose '19.1.16 PowerShell Scripts'
                    # OSBuild Only
                    #===================================================================================================
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "WinPE: WinPE.wim PowerShell Scripts" -ForegroundColor Green
                    foreach ($PSWimScript in $WinPEScriptsPE) {
                        if (Test-Path "$OSBuilderContent\$PSWimScript") {
                            Write-Host "PowerShell Script: $OSBuilderContent\$PSWimScript" -ForegroundColor DarkGray
                            (Get-Content "$OSBuilderContent\$PSWimScript").replace('winpe.wim.log', 'WinPE.log') | Set-Content "$OSBuilderContent\$PSWimScript"
                            Invoke-Expression "& '$OSBuilderContent\$PSWimScript'"
                        }
                    }
                    Write-Host "WinPE: WinRE.wim PowerShell Scripts" -ForegroundColor Green
                    foreach ($PSWimScript in $WinPEScriptsRE) {
                        if (Test-Path "$OSBuilderContent\$PSWimScript") {
                            Write-Host "PowerShell Script: $OSBuilderContent\$PSWimScript" -ForegroundColor DarkGray
                            (Get-Content "$OSBuilderContent\$PSWimScript").replace('winre.wim.log', 'WinRE.log') | Set-Content "$OSBuilderContent\$PSWimScript"
                            Invoke-Expression "& '$OSBuilderContent\$PSWimScript'"
                        }
                    }
                    Write-Host "WinPE: WinSE.wim PowerShell Scripts" -ForegroundColor Green
                    foreach ($PSWimScript in $WinPEScriptsSE) {
                        if (Test-Path "$OSBuilderContent\$PSWimScript") {
                            Write-Host "PowerShell Script: $OSBuilderContent\$PSWimScript" -ForegroundColor DarkGray
                            (Get-Content "$OSBuilderContent\$PSWimScript").replace('MountSetup', 'MountWinSE') | Set-Content "$OSBuilderContent\$PSWimScript"
                            (Get-Content "$OSBuilderContent\$PSWimScript").replace('setup.wim.log', 'WinSE.log') | Set-Content "$OSBuilderContent\$PSWimScript"
                            Invoke-Expression "& '$OSBuilderContent\$PSWimScript'"
                        }
                    }
                }

                #===================================================================================================
                Write-Verbose '19.1.1 Update-OSBWinPESources'
                #===================================================================================================
                Write-Host '========================================================================================' -ForegroundColor DarkGray
                Update-OSBWinPESources -OSMediaPath "$WorkingPath" -MountWinSE "$MountWinSE"

                #===================================================================================================
                Write-Verbose '19.1.1 Export-OSBWinPEPackages'
                #===================================================================================================
                #Write-Host '========================================================================================' -ForegroundColor DarkGray
                Export-OSBWinPEPackages -OSMediaPath "$WorkingPath" -MountWinPE "$MountWinPE" -MountWinRE "$MountWinRE" -MountWinSE "$MountWinSE"

                #===================================================================================================
                Write-Verbose '19.1.1 Prompt Before Dismount'
                #===================================================================================================
                if ($PromptBeforeDismountWinPE.IsPresent){[void](Read-Host 'Press Enter to Continue')}

                #===================================================================================================
                Write-Verbose '19.1.1 Dismount-OSBWinPE'
                #===================================================================================================
                #Write-Host '========================================================================================' -ForegroundColor DarkGray
                Dismount-OSBWinPE -OSMediaPath "$WorkingPath" -MountWinPE "$MountWinPE" -MountWinRE "$MountWinRE" -MountWinSE "$MountWinSE"

                #===================================================================================================
                Write-Verbose '19.1.1 Export-OSBWinPE'
                #===================================================================================================
                #Write-Host '========================================================================================' -ForegroundColor DarkGray
                Export-OSBWinPE -OSMediaPath "$WorkingPath" -MountWinPE "$MountWinPE" -MountWinRE "$MountWinRE" -MountWinSE "$MountWinSE"

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

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

                #===================================================================================================
                Write-Verbose '19.1.1 Install.wim: Mount'
                #===================================================================================================
                Write-Host '========================================================================================' -ForegroundColor DarkGray
                Write-Host "Install.wim: Mount to $MountDirectory" -ForegroundColor Green
                $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Mount-WindowsImage.log"
                Write-Verbose "$CurrentLog"
                Mount-WindowsImage -ImagePath "$WimTemp\install.wim" -Index 1 -Path "$MountDirectory" -LogPath "$CurrentLog" | Out-Null

                #===================================================================================================
                Write-Verbose '19.1.1 Install.wim: Mount Registry for UBR Information'
                #===================================================================================================
                #Write-Host '========================================================================================' -ForegroundColor DarkGray
                Write-Host "Install.wim: 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
                $OSVersionNumber = $($RegCurrentVersion.ReleaseId)
                $RegCurrentVersionUBR = $($RegCurrentVersion.UBR)
                $UBR = "$OSBuild.$RegCurrentVersionUBR"

                $RegCurrentVersion | Out-File "$Info\CurrentVersion.txt"
                $RegCurrentVersion | Out-File "$WorkingPath\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 Install.wim: Replace WinRE'
                #===================================================================================================
                if (!($Repair.IsPresent)) {
                    #Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "Install.wim: Replace $MountDirectory\Windows\System32\Recovery\winre.wim" -ForegroundColor Green
                    if (Test-Path "$MountDirectory\Windows\System32\Recovery\winre.wim") {
                        Remove-Item -Path "$MountDirectory\Windows\System32\Recovery\winre.wim" -Force
                    }

                    Copy-Item -Path "$WinPE\winre.wim" -Destination "$MountDirectory\Windows\System32\Recovery\winre.wim" -Force | Out-Null

                    $GetWindowsImage = Get-WindowsImage -ImagePath "$WinPE\winre.wim" -Index 1 | Select-Object -Property *
                    $GetWindowsImage | Out-File "$PEInfo\Get-WindowsImage-WinRE.txt"
                    (Get-Content "$PEInfo\Get-WindowsImage-WinRE.txt") | Where-Object {$_.Trim(" `t")} | Set-Content "$PEInfo\Get-WindowsImage-WinRE.txt"
                    $GetWindowsImage | Out-File "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Get-WindowsImage-WinRE.txt"
                    $GetWindowsImage | Export-Clixml -Path "$PEInfo\xml\Get-WindowsImage-WinRE.xml"
                    $GetWindowsImage | Export-Clixml -Path "$PEInfo\xml\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Get-WindowsImage-WinRE.xml"
                    $GetWindowsImage | ConvertTo-Json | Out-File "$PEInfo\json\Get-WindowsImage-WinRE.json"
                    $GetWindowsImage | ConvertTo-Json | Out-File "$PEInfo\json\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Get-WindowsImage-WinRE.json"
                }
                
                #===================================================================================================
                Write-Verbose '19.1.1 Install.wim: (SSU) Servicing Stack Update'
                #===================================================================================================
                if (!($Repair.IsPresent)) {
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "Install.wim: (SSU) Servicing Stack Update" -ForegroundColor Green
                    if (!($null -eq $UpdateCatServicing)) {
                        foreach ($Update in $UpdateCatServicing) {
                            $UpdateSSU = $(Get-ChildItem -Path $OSBuilderContent\Updates -Directory -Recurse | Where-Object {$_.Name -eq $($Update.KBTitle)}).FullName
                            if (Test-Path "$UpdateSSU") {
                                Write-Host "$UpdateSSU" -ForegroundColor DarkGray
                                if (Get-WindowsPackage -Path "$MountDirectory" | Where-Object {$_.PackageName -like "*$($Update.KBNumber)*"}) {
                                    Write-Warning "KB$($Update.KBNumber) is already installed"
                                } else {
                                    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ServicingStack-KB$($Update.KBNumber).log"
                                    Write-Verbose "$CurrentLog"
                                    Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$UpdateSSU" -LogPath "$CurrentLog" | Out-Null
                                }
                            } else {
                                Write-Warning "Not Found: $UpdateSSU"
                            }
                        }
                    }
                }

                #===================================================================================================
                Write-Verbose '19.1.1 Install.wim: Component Update'
                #===================================================================================================
                if (!($Repair.IsPresent)) {
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "Install.wim: Component Update" -ForegroundColor Green
                    if (!($null -eq $UpdateCatComponent)) {
                        foreach ($Update in $UpdateCatComponent) {
                            $UpdateComp = $(Get-ChildItem -Path $OSBuilderContent\Updates -Directory -Recurse | Where-Object {$_.Name -eq $($Update.KBTitle)}).FullName
                            if (Test-Path "$UpdateComp") {
                                Write-Host "$UpdateComp" -ForegroundColor DarkGray
                                if (Get-WindowsPackage -Path "$MountDirectory" | Where-Object {$_.PackageName -like "*$($Update.KBNumber)*"}) {
                                    Write-Warning "KB$($Update.KBNumber) is already installed"
                                } else {
                                    $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Component-KB$($Update.KBNumber).log"
                                    Write-Verbose "$CurrentLog"
                                    Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$UpdateComp" -LogPath "$CurrentLog" | Out-Null
                                }
                            } else {
                                Write-Warning "Not Found: $UpdateComp"
                            }
                        }
                    }
                }

                #===================================================================================================
                Write-Verbose '19.1.1 Install.wim: Update Build Revision (Pre-LCU)'
                #===================================================================================================
                $UBRPre = $UBR
                #Write-Host '========================================================================================' -ForegroundColor DarkGray
                #Write-Host "Install.wim: Update Build Revision $UBRPre (Pre-LCU)" -ForegroundColor Yellow

                #===================================================================================================
                Write-Verbose '19.1.1 Install.wim: (LCU) Latest Cumulative Update'
                #===================================================================================================
                if (!($Repair.IsPresent)) {
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "Install.wim: (LCU) Latest Cumulative Update (Pre-LCU UBR $UBRPre)" -ForegroundColor Green
                    if (!($null -eq $UpdateCatCumulative)) {
                        foreach ($Update in $UpdateCatCumulative) {
                            $UpdateLCU = $(Get-ChildItem -Path $OSBuilderContent\Updates -Directory -Recurse | Where-Object {$_.Name -eq $($Update.KBTitle)}).FullName
                            if (Test-Path "$UpdateLCU") {
                                Write-Host "$UpdateLCU" -ForegroundColor DarkGray
                                $SessionsXmlInstall = "$MountDirectory\Windows\Servicing\Sessions\Sessions.xml"
                                if (Test-Path $SessionsXmlInstall) {
                                    [xml]$XmlDocument = Get-Content -Path $SessionsXmlInstall
                                    if ($XmlDocument.Sessions.Session.Tasks.Phase.package | Where-Object {$_.Name -like "*$($Update.KBNumber)*" -and $_.targetState -eq 'Installed'}) {
                                        Write-Warning "KB$($Update.KBNumber) is already installed"
                                    } else {
                                        Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$UpdateLCU" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-UpdateCumulative-KB$($Update.KBNumber).log" | Out-Null
                                    }
                                } else {
                                    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-UpdateCumulative-KB$($Update.KBNumber).log"
                                    Write-Verbose "$CurrentLog"
                                    Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$UpdateLCU" -LogPath "$CurrentLog" | Out-Null
                                }
                            } else {
                                Write-Warning "Not Found: $UpdateLCU"
                            }
                        }
                    }
                }

                #===================================================================================================
                Write-Verbose '19.1.1 Install.wim: Registry and UBR PostInstall'
                #===================================================================================================
                #Write-Host '========================================================================================' -ForegroundColor DarkGray
                #Write-Host "Install.wim: Registry and UBR PostInstall" -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
                $OSVersionNumber = $($RegCurrentVersion.ReleaseId)
                $RegCurrentVersionUBR = $($RegCurrentVersion.UBR)
                $UBR = "$OSBuild.$RegCurrentVersionUBR"

                $RegCurrentVersion | Out-File "$Info\CurrentVersion.txt"
                $RegCurrentVersion | Out-File "$WorkingPath\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 Install.wim: Update Build Revision $UBR (Post-LCU)'
                #===================================================================================================
                #Write-Host '========================================================================================' -ForegroundColor DarkGray
                Write-Host "Install.wim: Update Build Revision $UBR (Post-LCU)" -ForegroundColor Green

                if (!($Repair.IsPresent)) {
                
                    #===================================================================================================
                    Write-Verbose '19.1.14 Install.wim: (NetCU) DotNet Framework Cumulative'
                    #===================================================================================================
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "Install.wim: (NetCU) DotNet Framework Cumulative Update" -ForegroundColor Green
                    if (!($null -eq $UpdateCatDotNet)) {
                        foreach ($Update in $UpdateCatDotNet) {
                            $UpdateNetCU = $(Get-ChildItem -Path $OSBuilderContent\Updates -Directory -Recurse | Where-Object {$_.Name -eq $($Update.KBTitle)}).FullName
                            if (Test-Path "$UpdateNetCU") {
                                Write-Host "$UpdateNetCU" -ForegroundColor DarkGray
                                if (Get-WindowsPackage -Path "$MountDirectory" | Where-Object {$_.PackageName -like "*$($Update.KBNumber)*"}) {
                                    Write-Warning "KB$($Update.KBNumber) is already installed"
                                } else {
                                    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-DotNet-KB$($Update.KBNumber).log"
                                    Write-Verbose "$CurrentLog"
                                    Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$UpdateNetCU" -LogPath "$CurrentLog" | Out-Null
                                }
                            } else {
                                Write-Warning "Not Found: $UpdateNetCU"
                            }
                        }
                    }

                    #===================================================================================================
                    Write-Verbose '19.1.1 Install.wim: (ASU) Adobe Flash Player Security Update'
                    #===================================================================================================
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "Install.wim: (ASU) Adobe Flash Player Security Update" -ForegroundColor Green
                    if (!($null -eq $UpdateCatAdobe)) {
                        foreach ($Update in $UpdateCatAdobe) {
                            $UpdateASU = @()
                            $UpdateASU = $(Get-ChildItem -Path $OSBuilderContent\Updates -Directory -Recurse | Where-Object {$_.Name -eq $($Update.KBTitle)}).FullName
                            if (Test-Path "$UpdateASU") {
                                Write-Host "$UpdateASU" -ForegroundColor DarkGray
                                if (Get-WindowsPackage -Path "$MountDirectory" | Where-Object {$_.PackageName -like "*$($Update.KBNumber)*"}) {
                                    Write-Warning "KB$($Update.KBNumber) is already installed"
                                } else {
                                    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-AdobeFlashPlayer-KB$($Update.KBNumber).log"
                                    Write-Verbose "$CurrentLog"
                                    Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$UpdateASU" -LogPath "$CurrentLog" | Out-Null
                                }
                            } else {
                                Write-Warning "Not Found: $UpdateASU"
                            }
                        }
                    }

                    #===================================================================================================
                    Write-Verbose '19.1.1 Install.wim: DISM Cleanup-Image'
                    #===================================================================================================
                    if ($OSVersion -like "10*") {
                        Write-Host '========================================================================================' -ForegroundColor DarkGray
                        Write-Host "Install.wim: DISM Cleanup-Image" -ForegroundColor Green
                        if ($(Get-WindowsCapability -Path $MountDirectory | Where-Object {$_.state -eq "*pending*"})) {
                            Write-Warning "Cannot run WindowsImage Cleanup on a WIM with Pending Installations"
                        } else {
                            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dism-Cleanup-Image.log"
                            Write-Verbose "$CurrentLog"
                            Dism /Image:"$MountDirectory" /Cleanup-Image /StartComponentCleanup /ResetBase /LogPath:"$CurrentLog"
                        }
                    }

                    #===================================================================================================
                    Write-Verbose '19.1.1 Install.wim: Windows 7 Updates'
                    #===================================================================================================
                    if ($OSBuild -eq 7601) {
                        Write-Host '========================================================================================' -ForegroundColor DarkGray
                        Write-Host "Install.wim: Windows 7 Updates" -ForegroundColor Green
                        if (!($null -eq $CatalogWindows7)) {
                            foreach ($Update in $CatalogWindows7) {
                                $UpdateWin7 = $(Get-ChildItem -Path $OSBuilderContent\Updates -Directory -Recurse | Where-Object {$_.Name -eq $($Update.KBTitle)}).FullName
                                if (Test-Path "$UpdateWin7") {
                                    Write-Host "$UpdateWin7" -ForegroundColor DarkGray
                                    if (Get-WindowsPackage -Path "$MountDirectory" | Where-Object {$_.PackageName -like "*$($Update.KBNumber)*"}) {
                                        Write-Warning "KB$($Update.KBNumber) is already installed"
                                    } else {
                                        $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-UpdateWin7-KB$($Update.KBNumber).log"
                                        Write-Verbose "$CurrentLog"
                                        Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$UpdateWin7" -LogPath "$CurrentLog" | Out-Null
                                    }
                                } else {
                                    Write-Warning "Not Found: $UpdateWin7"
                                }
                            }
                        }
                    }
                }
                
                #===================================================================================================
                Write-Verbose '19.1.1 OSBuild Only'
                #===================================================================================================
                if ($MyInvocation.MyCommand.Name -eq 'New-OSBuild' -and $OSMajorVersion -eq 10) {

                    #===================================================================================================
                    Write-Verbose '19.1.1 OSBuild Language Packs'
                    # OSBuild Only
                    #===================================================================================================
                    if ($LanguagePacks) {
                        Write-Host '========================================================================================' -ForegroundColor DarkGray
                        Write-Host "Install.wim: Language Packs"    -ForegroundColor Green
                        foreach ($Update in $LanguagePacks) {
                            if (Test-Path "$OSBuilderContent\$Update") {
                                Write-Host "$OSBuilderContent\$Update" -ForegroundColor DarkGray
                                Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$OSBuilderContent\$Update" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-LanguagePack.log"
                            } else {
                                Write-Warning "Not Found: $OSBuilderContent\$Update"
                            }
                        }
                    }
                    if ($LanguageInterfacePacks) {
                        Write-Host '========================================================================================' -ForegroundColor DarkGray
                        Write-Host "Install.wim: Language Interface Packs"    -ForegroundColor Green
                        foreach ($Update in $LanguageInterfacePacks) {
                            if (Test-Path "$OSBuilderContent\$Update") {
                                Write-Host "$OSBuilderContent\$Update" -ForegroundColor DarkGray
                                Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$OSBuilderContent\$Update" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-LanguageInterfacePack.log"
                            } else {
                                Write-Warning "Not Found: $OSBuilderContent\$Update"
                            }
                        }
                    }
                    if ($LanguageFeatures) {
                        Write-Host '========================================================================================' -ForegroundColor DarkGray
                        Write-Host "Install.wim: Language Features"    -ForegroundColor Green
                        foreach ($Update in $LanguageFeatures | Where-Object {$_ -notlike "*Speech*"}) {
                            if (Test-Path "$OSBuilderContent\$Update") {
                                Write-Host "$OSBuilderContent\$Update" -ForegroundColor DarkGray
                                Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$OSBuilderContent\$Update" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-LanguageFeatures.log"
                            }
                        }
                        foreach ($Update in $LanguageFeatures | Where-Object {$_ -like "*TextToSpeech*"}) {
                            if (Test-Path "$OSBuilderContent\$Update") {
                                Write-Host "$OSBuilderContent\$Update" -ForegroundColor DarkGray
                                Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$OSBuilderContent\$Update" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-LanguageFeatures.log"
                            }
                        }
                        foreach ($Update in $LanguageFeatures | Where-Object {$_ -like "*Speech*" -and $_ -notlike "*TextToSpeech*"}) {
                            if (Test-Path "$OSBuilderContent\$Update") {
                                Write-Host "$OSBuilderContent\$Update" -ForegroundColor DarkGray
                                Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$OSBuilderContent\$Update" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-LanguageFeatures.log"
                            }
                        }
                    }

                    if ($LanguagePacks -or $LanguageInterfacePacks -or $LanguageFeatures) {
                        #===================================================================================================
                        Write-Verbose '19.1.1 Install.wim: Generating Langini'
                        #===================================================================================================
                        Write-Host '========================================================================================' -ForegroundColor DarkGray
                        Write-Host "Install.wim: Generating Updated Langini" -ForegroundColor Green
                        Dism /Image:"$MountDirectory" /Gen-LangIni /Distribution:"$OS" /LogPath:"$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dism-gen-langini.log"
                        #===================================================================================================
                        Write-Verbose '19.1.1 Install.wim: Set Language Settings'
                        #===================================================================================================
                        if ($SetAllIntl) {
                            #Write-Host '========================================================================================' -ForegroundColor DarkGray
                            Write-Host "Install.wim: SetAllIntl" -ForegroundColor Green
                            Dism /Image:"$MountDirectory" /Set-AllIntl:"$SetAllIntl" /LogPath:"$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dism-SetAllIntl.log"
                        }
                        if ($SetInputLocale) {
                            #Write-Host '========================================================================================' -ForegroundColor DarkGray
                            Write-Host "Install.wim: SetInputLocale" -ForegroundColor Green
                            Dism /Image:"$MountDirectory" /Set-InputLocale:"$SetInputLocale" /LogPath:"$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dism-SetInputLocale.log"
                        }
                        if ($SetSKUIntlDefaults) {
                            #Write-Host '========================================================================================' -ForegroundColor DarkGray
                            Write-Host "Install.wim: SetSKUIntlDefaults" -ForegroundColor Green
                            Dism /Image:"$MountDirectory" /Set-SKUIntlDefaults:"$SetSKUIntlDefaults" /LogPath:"$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dism-SetSKUIntlDefaults.log"
                        }
                        if ($SetSetupUILang) {
                            #Write-Host '========================================================================================' -ForegroundColor DarkGray
                            Write-Host "Install.wim: SetSetupUILang" -ForegroundColor Green
                            Dism /Image:"$MountDirectory" /Set-SetupUILang:"$SetSetupUILang" /Distribution:"$OS" /LogPath:"$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dism-SetSetupUILang.log"
                        }
                        if ($SetSysLocale) {
                            #Write-Host '========================================================================================' -ForegroundColor DarkGray
                            Write-Host "Install.wim: SetSysLocale" -ForegroundColor Green
                            Dism /Image:"$MountDirectory" /Set-SysLocale:"$SetSysLocale" /LogPath:"$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dism-SetSysLocale.log"
                        }
                        if ($SetUILang) {
                            #Write-Host '========================================================================================' -ForegroundColor DarkGray
                            Write-Host "Install.wim: SetUILang" -ForegroundColor Green
                            Dism /Image:"$MountDirectory" /Set-UILang:"$SetUILang" /LogPath:"$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dism-SetUILang.log"
                        }
                        if ($SetUILangFallback) {
                            #Write-Host '========================================================================================' -ForegroundColor DarkGray
                            Write-Host "Install.wim: SetUILangFallback" -ForegroundColor Green
                            Dism /Image:"$MountDirectory" /Set-UILangFallback:"$SetUILangFallback" /LogPath:"$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dism-SetUILangFallback.log"
                        }
                        if ($SetUserLocale) {
                            #Write-Host '========================================================================================' -ForegroundColor DarkGray
                            Write-Host "Install.wim: SetUserLocale" -ForegroundColor Green
                            Dism /Image:"$MountDirectory" /Set-UserLocale:"$SetUserLocale" /LogPath:"$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dism-SetUserLocale.log"
                        }
                        #===================================================================================================
                        Write-Verbose '19.1.1 Install.wim: (LCU) Latest Cumulative Update'
                        #===================================================================================================
                        Write-Host '========================================================================================' -ForegroundColor DarkGray
                        Write-Host "Install.wim: LCU (Latest Cumulative Update)" -ForegroundColor Green
                        if (!($null -eq $UpdateCatCumulative)) {
                            foreach ($Update in $UpdateCatCumulative) {
                                $UpdateCU = $(Get-ChildItem -Path $OSBuilderContent\Updates -Directory -Recurse | Where-Object {$_.Name -eq $($Update.KBTitle)}).FullName
                                if (Test-Path "$UpdateCU") {
                                    Write-Host "Install.wim: $UpdateCU" -ForegroundColor DarkGray
                                    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Cumulative-KB$($Update.KBNumber).log"
                                    Write-Verbose "$CurrentLog"
                                    Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$UpdateCU" -LogPath "$CurrentLog" | Out-Null
                                } else {
                                    Write-Warning "Not Found: $UpdateCU"
                                }
                            }
                        }

                        #===================================================================================================
                        Write-Verbose '19.1.1 Install.wim: DISM Cleanup-Image'
                        #===================================================================================================
                        if ($OSMajorVersion -eq 10) {
                            Write-Host '========================================================================================' -ForegroundColor DarkGray
                            Write-Host "Install.wim: DISM Cleanup-Image" -ForegroundColor Green
                            if ($(Get-WindowsCapability -Path $MountDirectory | Where-Object {$_.state -eq "*pending*"})) {
                                Write-Warning "Cannot run WindowsImage Cleanup on a WIM with Pending Installations"
                            } else {
                                $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dism-Cleanup-Image.log"
                                Write-Verbose "$CurrentLog"
                                Dism /Image:"$MountDirectory" /Cleanup-Image /StartComponentCleanup /ResetBase /LogPath:"$CurrentLog"
                            }
                        }
                    }
                }

                if ($MyInvocation.MyCommand.Name -eq 'New-OSBuild') {
                    #===================================================================================================
                    Write-Verbose '19.1.1 OSBuild Windows Optional Features'
                    #===================================================================================================
                    if ($EnableFeature) {
                        Write-Host '========================================================================================' -ForegroundColor DarkGray
                        Write-Host "Install.wim: Enable Windows Optional Feature"    -ForegroundColor Green
                        foreach ($FeatureName in $EnableFeature) {
                            Write-Host $FeatureName -ForegroundColor DarkGray
                            Enable-WindowsOptionalFeature -FeatureName $FeatureName -Path "$MountDirectory" -All -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Enable-WindowsOptionalFeature.log" | Out-Null
                        }
                        
                        if ($OSMajorVersion -eq 10) {
                            #===================================================================================================
                            Write-Verbose '19.1.1 Install.wim: (LCU) Latest Cumulative Update'
                            #===================================================================================================
                            Write-Host '========================================================================================' -ForegroundColor DarkGray
                            Write-Host "Install.wim: LCU (Latest Cumulative Update)" -ForegroundColor Green
                            if (!($null -eq $UpdateCatCumulative)) {
                                foreach ($Update in $UpdateCatCumulative) {
                                    $UpdateCU = $(Get-ChildItem -Path $OSBuilderContent\Updates -Directory -Recurse | Where-Object {$_.Name -eq $($Update.KBTitle)}).FullName
                                    if (Test-Path "$UpdateCU") {
                                        Write-Host "Install.wim: $UpdateCU" -ForegroundColor DarkGray
                                        $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Cumulative-KB$($Update.KBNumber).log"
                                        Write-Verbose "$CurrentLog"
                                        Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$UpdateCU" -LogPath "$CurrentLog" | Out-Null
                                    } else {
                                        Write-Warning "Not Found: $UpdateCU"
                                    }
                                }
                            }

                            #===================================================================================================
                            Write-Verbose '19.1.1 Install.wim: DISM Cleanup-Image'
                            #===================================================================================================
                            if ($OSVersion -like "10*") {
                                Write-Host '========================================================================================' -ForegroundColor DarkGray
                                Write-Host "Install.wim: DISM Cleanup-Image" -ForegroundColor Green
                                if ($(Get-WindowsCapability -Path $MountDirectory | Where-Object {$_.state -eq "*pending*"})) {
                                    Write-Warning "Cannot run WindowsImage Cleanup on a WIM with Pending Installations"
                                } else {
                                    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dism-Cleanup-Image.log"
                                    Write-Verbose "$CurrentLog"
                                    Dism /Image:"$MountDirectory" /Cleanup-Image /StartComponentCleanup /ResetBase /LogPath:"$CurrentLog"
                                }
                            }
                        }
                        
                        #===================================================================================================
                        Write-Verbose '19.1.1 Install.wim: Windows 7 Updates'
                        #===================================================================================================
                        if ($OSBuild -eq 7601) {
                            Write-Host '========================================================================================' -ForegroundColor DarkGray
                            Write-Host "Install.wim: Windows 7 Updates" -ForegroundColor Green
                            if (!($null -eq $CatalogWindows7)) {
                                foreach ($Update in $CatalogWindows7) {
                                    $UpdateWin7 = $(Get-ChildItem -Path $OSBuilderContent\Updates -Directory -Recurse | Where-Object {$_.Name -eq $($Update.KBTitle)}).FullName
                                    if (Test-Path "$UpdateWin7") {
                                        Write-Host "$UpdateWin7" -ForegroundColor DarkGray
                                        if (Get-WindowsPackage -Path "$MountDirectory" | Where-Object {$_.PackageName -like "*$($Update.KBNumber)*"}) {
                                            Write-Warning "KB$($Update.KBNumber) is already installed"
                                        } else {
                                            $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-UpdateWin7-KB$($Update.KBNumber).log"
                                            Write-Verbose "$CurrentLog"
                                            Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$UpdateWin7" -LogPath "$CurrentLog" | Out-Null
                                        }
                                    } else {
                                        Write-Warning "Not Found: $UpdateWin7"
                                    }
                                }
                            }
                        }
                    }

                    #===================================================================================================
                    Write-Verbose '19.1.1 OSBuild EnableNetFX3'
                    #===================================================================================================
                    if ($EnableNetFX3 -eq 'True' -and $OSMajorVersion -eq 10) {
                        Write-Host '========================================================================================' -ForegroundColor DarkGray
                        Write-Host "Install.wim: Enable NetFX 3.5"    -ForegroundColor Green
                        Enable-WindowsOptionalFeature -Path "$MountDirectory" -FeatureName NetFX3 -All -LimitAccess -Source "$OS\sources\sxs" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-NetFX3.log" | Out-Null
                        #===================================================================================================
                        Write-Verbose '19.1.1 Install.wim: (LCU) Latest Cumulative Update'
                        #===================================================================================================
                        Write-Host '========================================================================================' -ForegroundColor DarkGray
                        Write-Host "Install.wim: (LCU) Latest Cumulative Update" -ForegroundColor Green
                        if (!($null -eq $UpdateCatCumulative)) {
                            foreach ($Update in $UpdateCatCumulative) {
                                $UpdateCU = $(Get-ChildItem -Path $OSBuilderContent\Updates -Directory -Recurse | Where-Object {$_.Name -eq $($Update.KBTitle)}).FullName
                                if (Test-Path "$UpdateCU") {
                                    Write-Host "$UpdateCU" -ForegroundColor DarkGray
                                    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Cumulative-KB$($Update.KBNumber).log"
                                    Write-Verbose "$CurrentLog"
                                    Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$UpdateCU" -LogPath "$CurrentLog" | Out-Null
                                } else {
                                    Write-Warning "Not Found: $UpdateCU"
                                }
                            }
                        }
                        #===================================================================================================
                        Write-Verbose '19.1.14 Install.wim: (NetCU) DotNet Framework Cumulative'
                        #===================================================================================================
                        Write-Host '========================================================================================' -ForegroundColor DarkGray
                        Write-Host "Install.wim: (NetCU) DotNet Framework Cumulative Update" -ForegroundColor Green
                        if (!($null -eq $UpdateCatDotNet)) {
                            foreach ($Update in $UpdateCatDotNet) {
                                $UpdateNetCU = $(Get-ChildItem -Path $OSBuilderContent\Updates -Directory -Recurse | Where-Object {$_.Name -eq $($Update.KBTitle)}).FullName
                                if (Test-Path "$UpdateNetCU") {
                                    Write-Host "$UpdateNetCU" -ForegroundColor DarkGray
                                    $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-DotNet-KB$($Update.KBNumber).log"
                                    Write-Verbose "$CurrentLog"
                                    Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$UpdateNetCU" -LogPath "$CurrentLog" | Out-Null
                                } else {
                                    Write-Warning "Not Found: $UpdateNetCU"
                                }
                            }
                        }
                    }

                    #===================================================================================================
                    Write-Verbose '19.1.1 Remove Appx Packages'
                    #===================================================================================================
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "Install.wim: Remove Appx Packages"    -ForegroundColor Green
                    if ($RemoveAppx -and $OSMajorVersion -eq 10) {
                        foreach ($item in $RemoveAppx) {
                            Write-Host $item -ForegroundColor DarkGray
                            Remove-AppxProvisionedPackage -Path "$MountDirectory" -PackageName $item -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Remove-AppxProvisionedPackage.log" | Out-Null
                        }
                    }
                    #===================================================================================================
                    Write-Verbose '19.1.1 Remove Packages'
                    #===================================================================================================
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "Install.wim: Remove Windows Packages"    -ForegroundColor Green
                    if ($RemovePackage) {
                        foreach ($PackageName in $RemovePackage) {
                            Write-Host $item -ForegroundColor DarkGray
                            Remove-WindowsPackage -Path "$MountDirectory" -PackageName $PackageName -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Remove-WindowsPackage.log" | Out-Null
                        }
                    }
                    #===================================================================================================
                    Write-Verbose '19.1.1 Remove Capability'
                    #===================================================================================================
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "Install.wim: Remove Windows Capability"    -ForegroundColor Green
                    if ($RemoveCapability) {
                        foreach ($Name in $RemoveCapability) {
                            Write-Host $Name -ForegroundColor DarkGray
                            Remove-WindowsCapability -Path "$MountDirectory" -Name $Name -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Remove-WindowsCapability.log" | Out-Null
                        }
                    }
                    #===================================================================================================
                    Write-Verbose '19.1.1 Disable Windows Optional Feature'
                    #===================================================================================================
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "Install.wim: Disable Windows Optional Feature" -ForegroundColor Green
                    if ($DisableFeature) {
                        foreach ($FeatureName in $DisableFeature) {
                            Write-Host $FeatureName -ForegroundColor DarkGray
                            Disable-WindowsOptionalFeature -FeatureName $FeatureName -Path "$MountDirectory" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Disable-WindowsOptionalFeature.log" | Out-Null
                        }
                    }
                    #===================================================================================================
                    Write-Verbose '19.1.1 Add Packages'
                    #===================================================================================================
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "Install.wim: Add Packages"    -ForegroundColor Green
                    if ($Packages) {
                        foreach ($PackagePath in $Packages) {
                            Write-Host "$OSBuilderContent\$PackagePath" -ForegroundColor DarkGray
                            Add-WindowsPackage -PackagePath "$OSBuilderContent\$PackagePath" -Path "$MountDirectory" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-WindowsPackage.log" | Out-Null
                        }
                    }
                    #===================================================================================================
                    Write-Verbose '19.1.11 Add Drivers'
                    #===================================================================================================
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "Install.wim: Add Drivers"    -ForegroundColor Green
                    if ($Drivers) {
                        foreach ($Driver in $Drivers) {
                            Write-Host "$OSBuilderContent\$Driver" -ForegroundColor DarkGray
                            if ($OSMajorVersion -eq 6) {
                                dism /Image:"$MountDirectory" /Add-Driver /Driver:"$OSBuilderContent\$Driver" /Recurse /ForceUnsigned /LogPath:"$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-DISM-Add-Driver.log"
                            } else {

                                Add-WindowsDriver -Driver "$OSBuilderContent\$Driver" -Recurse -Path "$MountDirectory" -ForceUnsigned -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-WindowsDriver.log" | Out-Null
                            }
                        }
                    }
                    #===================================================================================================
                    Write-Verbose '19.1.1 Extra Files'
                    #===================================================================================================
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "Install.wim: Extra Files"    -ForegroundColor Green
                    if ($ExtraFiles) {
                        foreach ($ExtraFile in $ExtraFiles) {
                            Write-Host "$OSBuilderContent\$ExtraFile" -ForegroundColor DarkGray
                            robocopy "$OSBuilderContent\$ExtraFile" "$MountDirectory" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ExtraFiles.log" | Out-Null
                        }
                    }
                    
                    #===================================================================================================
                    Write-Verbose '19.1.11 Start Layout'
                    #===================================================================================================
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "Install.wim: Start Layout" -ForegroundColor Green
                    if ($StartLayoutXML -and $OSMajorVersion -eq 10) {
                        Write-Host "$OSBuilderContent\$StartLayoutXML" -ForegroundColor DarkGray
                        Copy-Item -Path "$OSBuilderContent\$StartLayoutXML" -Destination "$MountDirectory\Users\Default\AppData\Local\Microsoft\Windows\Shell\LayoutModification.xml" -Recurse -Force | Out-Null
                    }

                    #===================================================================================================
                    Write-Verbose '19.1.11 Unattend.xml'
                    #===================================================================================================
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "Install.wim: Unattend.xml" -ForegroundColor Green
                    if ($UnattendXML -and $OSMajorVersion -eq 10) {
                        Write-Host "$OSBuilderContent\$UnattendXML" -ForegroundColor DarkGray
                        if (!(Test-Path "$MountDirectory\Windows\Panther")) {New-Item -Path "$MountDirectory\Windows\Panther" -ItemType Directory -Force | Out-Null}
                        Copy-Item -Path "$OSBuilderContent\$UnattendXML" -Destination "$MountDirectory\Windows\Panther\Unattend.xml" -Force
                        Use-WindowsUnattend -UnattendPath "$OSBuilderContent\$UnattendXML" -Path "$MountDirectory" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Use-WindowsUnattend.log" | Out-Null
                    }
                    
                    #===================================================================================================
                    Write-Verbose '19.1.1 PowerShell Scripts'
                    #===================================================================================================
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "Install.wim: PowerShell Scripts" -ForegroundColor Green
                    foreach ($PSScript in $Scripts) {
                        if (Test-Path "$OSBuilderContent\$PSScript") {
                            Write-Host "PowerShell Script: $OSBuilderContent\$PSScript" -ForegroundColor Green
                            Invoke-Expression "& '$OSBuilderContent\$PSScript'"
                        }
                    }
                }
                
                #===================================================================================================
                Write-Verbose '19.1.1 Copy-OSBAutoExtraFiles'
                #===================================================================================================
                Write-Host '========================================================================================' -ForegroundColor DarkGray
                Copy-OSBAutoExtraFiles -OSMediaPath "$WorkingPath" -MountDirectory "$MountDirectory"

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

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

                #===================================================================================================
                Write-Verbose '19.1.1 Install.wim: Dismount'
                #===================================================================================================
                #Write-Host '========================================================================================' -ForegroundColor DarkGray
                Write-Host "Install.wim: Dismount from $MountDirectory" -ForegroundColor Green

                if ($PromptBeforeDismount.IsPresent){[void](Read-Host 'Press Enter to Continue')}

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

                #===================================================================================================
                Write-Verbose '19.1.1 Install.wim: Export'
                #===================================================================================================
                #Write-Host '========================================================================================' -ForegroundColor DarkGray
                Write-Host "Install.wim: Export to $OS\sources\install.wim" -ForegroundColor Green
                $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Export-WindowsImage.log"
                Write-Verbose "$CurrentLog"
                Export-WindowsImage -SourceImagePath "$WimTemp\install.wim" -SourceIndex 1 -DestinationImagePath "$OS\sources\install.wim" -LogPath "$CurrentLog" | Out-Null

                #===================================================================================================
                Write-Verbose '19.1.1 Install.wim: Export Configuration'
                #===================================================================================================
                #Write-Host '========================================================================================' -ForegroundColor DarkGray
                Write-Host "Install.wim: Export Configuration to $WorkingPath\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 "$WorkingPath\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 "$WorkingPath\WindowsImage.txt") | Where-Object {$_.Trim(" `t")} | Set-Content "$WorkingPath\WindowsImage.txt"
                
                #===================================================================================================
                Write-Verbose '19.1.1 Install.wim: Export Content'
                #===================================================================================================
                #Write-Host '========================================================================================' -ForegroundColor DarkGray
                Write-Host "Install.wim: Export 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 UBR Validation'
                #===================================================================================================
                if (!($Repair.IsPresent)) {
                    if ($UBRPre -eq $UBR) {
                        Write-Host '========================================================================================' -ForegroundColor DarkGray
                        Write-Warning 'The Update Build Revision did not change after Windows Updates'
                        Write-Warning 'There may have been an issue applying the Latest Cumulative Update if this was not expected'
                    }
                    if (!($UBR)) {
                        Write-Host '========================================================================================' -ForegroundColor DarkGray
                        $UBR = $((Get-Date).ToString('mmss'))
                        Write-Warning 'Could not determine a UBR'
                    }
                }

                #===================================================================================================
                Write-Verbose '19.1.1 Remove Temporary Files'
                #===================================================================================================
                if (Test-Path "$WimTemp") {Remove-Item -Path "$WimTemp" -Force -Recurse | Out-Null}
                if (Test-Path "$MountDirectory") {Remove-Item -Path "$MountDirectory" -Force -Recurse | Out-Null}
                if (Test-Path "$MountWinRE") {Remove-Item -Path "$MountWinRE" -Force -Recurse | Out-Null}
                if (Test-Path "$MountWinPE") {Remove-Item -Path "$MountWinPE" -Force -Recurse | Out-Null}
                if (Test-Path "$MountWinSE") {Remove-Item -Path "$MountWinSE" -Force -Recurse | Out-Null}

                #===================================================================================================
                Write-Verbose '19.1.1 Set New Name'
                #===================================================================================================
                $OSImageName = $($GetWindowsImage.ImageName)
                $OSImageName = $OSImageName -replace '\(', ''
                $OSImageName = $OSImageName -replace '\)', ''

                $OSArchitecture = $($GetWindowsImage.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'}

                $OSBuild = $($GetWindowsImage.Build)
                $OSVersionNumber = $null
                if (Test-Path "$Info\xml\CurrentVersion.xml") {
                    $RegCurrentVersion = Import-Clixml -Path "$Info\xml\CurrentVersion.xml"
                    $OSVersionNumber = $($RegCurrentVersion.ReleaseId)
                }

                if ($OSBuild -eq 7601) {$OSVersionNumber = 7601}
                if ($OSBuild -eq 10240) {$OSVersionNumber = 1507}
                if ($OSBuild -eq 14393) {$OSVersionNumber = 1607}
                if ($OSBuild -eq 15063) {$OSVersionNumber = 1703}
                if ($OSBuild -eq 16299) {$OSVersionNumber = 1709}
                if ($OSBuild -eq 17134) {$OSVersionNumber = 1803}
                if ($OSBuild -eq 17763) {$OSVersionNumber = 1809}

                if ($null -eq $OSVersionNumber) {
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Warning "Windows Image Build $OSBuild is not automatically recognized"
                    Write-Warning "Check for an updated version of OSBuilder"
                    if ($WorkingName -like "build*") {$NewOSMediaName = "$OSImageName $OSArchitecture $UBR"}
                } elseif ($OSBuild -eq 7601) {
                    if ($WorkingName -like "build*") {$NewOSMediaName = "$OSImageName $OSArchitecture SP1 $UBR"}
                } else {
                    if ($WorkingName -like "build*") {$NewOSMediaName = "$OSImageName $OSArchitecture $OSVersionNumber $UBR"}
                }

                $OSLanguages = $($GetWindowsImage.Languages)

                $NewOSMediaName = "$NewOSMediaName $OSLanguages"
                if ($($OSLanguages.count) -eq 1) {$NewOSMediaName = $NewOSMediaName.replace(' en-US','')}

                if ($MyInvocation.MyCommand.Name -eq 'New-OSBuild') {
                    if ($CustomName) {$NewOSMediaName = "$CustomName $UBR"}
                }
                
                if ($MyInvocation.MyCommand.Name -eq 'Update-OSMedia') {$NewOSMediaPath = "$OSBuilderOSMedia\$NewOSMediaName"}
                if ($MyInvocation.MyCommand.Name -eq 'New-OSBuild') {$NewOSMediaPath = "$OSBuilderOSBuilds\$NewOSMediaName"}

                #===================================================================================================
                Write-Verbose '19.1.1 Rename Build Directory'
                #===================================================================================================
                if (!($Repair.IsPresent)) {
                    if (Test-Path $NewOSMediaPath) {
                        $mmss = $((Get-Date).ToString('mmss'))
                        Write-Host '========================================================================================' -ForegroundColor DarkGray
                        Write-Warning 'Trying to rename the Build directory, but it already exists'
                        Write-Warning "Appending $mmss to the directory Name"
                        Write-Host '========================================================================================' -ForegroundColor DarkGray
                        $NewOSMediaName = "$NewOSMediaName $mmss"
                        $NewOSMediaPath = "$OSBuilderOSMedia\$NewOSMediaName"
                    }
                }

                #===================================================================================================
                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 New-OSBMediaISO'
                #===================================================================================================
                if ($CreateISO.IsPresent) {
                    New-OSBMediaISO -FullName "$WorkingPath"
                }

                #===================================================================================================
                Write-Verbose '19.1.1 Show-OSBMediaInfo'
                #===================================================================================================
                if ($ShowMediaInfo.IsPresent) {
                    Show-OSBMediaInfo -FullName "$WorkingPath"
                }

                #===================================================================================================
                Write-Verbose '19.1.1 Stop Transcript'
                #===================================================================================================
                if ($Repair.IsPresent) {
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Stop-Transcript
                }
                else {
                    Write-Host "Media: Renaming ""$WorkingPath"" to ""$NewOSMediaName""" -ForegroundColor Green
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Stop-Transcript
                    Rename-Item -Path "$WorkingPath" -NewName "$NewOSMediaName" -ErrorAction Stop
                }
            }
        }
    }

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