Public/New-PEBuild.ps1

<#
.SYNOPSIS
Creates a new PEBuild from an PEBuild Task
 
.DESCRIPTION
Creates a new PEBuild from an PEBuild Task created with New-PEBuildTask
 
.LINK
https://osdbuilder.osdeploy.com/module/functions/new-pebuild
#>

function New-PEBuild {
    [CmdletBinding(DefaultParameterSetName='Basic')]
    param (
        #Creates an ISO of the Updated Media
        #oscdimg.exe from Windows ADK is required
        [Alias('ISO','OSDISO')]
        [switch]$CreateISO = $global:SetOSDBuilder.NewPEBuildCreateISO,

        #Executes the PEBuild
        [switch]$Execute = $global:SetOSDBuilder.NewPEBuildExecute,

        #Adds a 'Press Enter to Continue' prompt before WinPE is dismounted
        [Parameter(ParameterSetName='Advanced')]
        [switch]$PauseDismount = $global:SetOSDBuilder.NewPEBuildPauseDismount,

        #Adds a 'Press Enter to Continue' prompt after WinPE is mounted
        [Parameter(ParameterSetName='Advanced')]
        [switch]$PauseMount = $global:SetOSDBuilder.NewPEBuildPauseMount
    )

    Begin {
        #=================================================
        # Get-OSDBuilder
        #=================================================
        Get-OSDBuilder -CreatePaths -HideDetails
        #=================================================
        # Block
        #=================================================
        Block-StandardUser
        #=================================================

#=================================================
Write-Verbose 'MDT Files'
#=================================================
$MDTwinpeshl = @'
[LaunchApps]
%SYSTEMROOT%\System32\bddrun.exe,/bootstrap
'@


$DaRTwinpeshl = @'
[LaunchApps]
%windir%\system32\netstart.exe,-network
%SYSTEMDRIVE%\sources\recovery\recenv.exe
'@


$MDTUnattendPEx64 = @'
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
    <settings pass="windowsPE">
        <component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State">
            <Display>
                <ColorDepth>32</ColorDepth>
                <HorizontalResolution>1024</HorizontalResolution>
                <RefreshRate>60</RefreshRate>
                <VerticalResolution>768</VerticalResolution>
            </Display>
            <RunSynchronous>
                <RunSynchronousCommand wcm:action="add">
                    <Description>Lite Touch PE</Description>
                    <Order>1</Order>
                    <Path>wscript.exe X:\Deploy\Scripts\LiteTouch.wsf</Path>
                </RunSynchronousCommand>
            </RunSynchronous>
        </component>
    </settings>
</unattend>
'@


$MDTUnattendPEx86 = @'
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
    <settings pass="windowsPE">
        <component name="Microsoft-Windows-Setup" processorArchitecture="x86" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State">
            <Display>
                <ColorDepth>32</ColorDepth>
                <HorizontalResolution>1024</HorizontalResolution>
                <RefreshRate>60</RefreshRate>
                <VerticalResolution>768</VerticalResolution>
            </Display>
            <RunSynchronous>
                <RunSynchronousCommand wcm:action="add">
                    <Description>Lite Touch PE</Description>
                    <Order>1</Order>
                    <Path>wscript.exe X:\Deploy\Scripts\LiteTouch.wsf</Path>
                </RunSynchronousCommand>
            </RunSynchronous>
        </component>
    </settings>
</unattend>
'@


    }

    Process {
        Write-Host '========================================================================================' -ForegroundColor DarkGray
        Write-Host -ForegroundColor Green "$($MyInvocation.MyCommand.Name) PROCESS"
        Write-Verbose "MyInvocation.MyCommand.Name: $($MyInvocation.MyCommand.Name)"
        Write-Verbose "PSCmdlet.ParameterSetName: $($PSCmdlet.ParameterSetName)"
        #=================================================
        # PEBuild
        #=================================================
        $GetPEBuildTask = @()
        #$GetPEBuildTask = Get-ChildItem -Path $SetOSDBuilderPathTasks *.json -File | Select-Object -Property BaseName, FullName, Length, CreationTime, LastWriteTime | Sort-Object -Property BaseName
        #$GetPEBuildTask = $GetPEBuildTask | Where-Object {$_.BaseName -like "MDT*" -or $_.BaseName -like "Recovery*" -or $_.BaseName -like "WinPE*"}
        #$GetPEBuildTask = $GetPEBuildTask | Out-GridView -Title "OSDBuilder Tasks: Select one or more Tasks to execute and press OK (Cancel to Exit)" -Passthru
        $GetPEBuildTask = Get-PEBuildTask | Out-GridView -PassThru -Title "PEBuild Tasks: Select one or more Tasks to execute and press OK (Cancel to Exit)"

        if($null -eq $GetPEBuildTask) {
            Write-Warning "PEBuild Task was not selected or found . . . Exiting!"
            Return
        }

        foreach ($Item in $GetPEBuildTask) {
            #=================================================
            Write-Verbose '19.1.1 PEBuild Task Contents'
            #=================================================
            $Task = Get-Content "$($Item.FullName)" | ConvertFrom-Json
            $TaskType = $($Task.TaskType)
            $TaskName = $($Task.TaskName)
            $TaskVersion = $($Task.TaskVersion)

            $WinPEOutput = $($Task.WinPEOutput)
            $CustomName = $($Task.CustomName)
            if ((Get-IsContentPacksEnabled) -and (!($SkipContentPacks.IsPresent))) {
                if ($null -eq $Task.ContentPacks) {
                    $ContentPacks = @('_Global')
                } else {
                    $ContentPacks = @('_Global')
                    $ContentPacks = ($ContentPacks += $Task.ContentPacks)
                }
            }

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

            $WinPEAutoExtraFiles = $($Task.WinPEAutoExtraFiles)
            $WinPEOSDCloud = $Task.WinPEOSDCloud
            $WinREWiFi = $Task.WinREWiFi

            $MDTDeploymentShare = $($Task.MDTDeploymentShare)
            $ScratchSpace = $($Task.ScratchSpace)
            $SourceWim = $($Task.SourceWim)
            $WinPEADK = $($Task.WinPEADK)
            $WinPEDaRT = $($Task.WinPEDaRT)
            $WinPEDrivers = $($Task.WinPEDrivers)
            $WinPEExtraFiles = $($Task.WinPEExtraFiles)
            $WinPEScripts = $($Task.WinPEScripts)

            #=================================================
            Write-Verbose '19.1.1 PEBuild Task Information'
            #=================================================
            Write-Host '========================================================================================' -ForegroundColor DarkGray
            Write-Host "PEBuild Task Information" -ForegroundColor Green
            Write-Host "-TaskName: $TaskName"
            Write-Host "-TaskVersion: $TaskVersion"
            Write-Host "-TaskType: $TaskType"
            #Write-Host "-OSMediaName: $OSMediaName"
            #Write-Host "-OSMediaPath: $OSMediaPath"
            Write-Host "-WinPE Output: $WinPEOutput"
            Write-Host "-Custom Name: $CustomName"

            if (Get-IsContentPacksEnabled) {
                Write-Host "-ContentPacks:" -ForegroundColor Cyan
                foreach ($item in $ContentPacks)       {Write-Host " $SetOSDBuilderPathTemplates\$item" -ForegroundColor Cyan}}
    
            Write-Host "-MDT Deployment Share: $MDTDeploymentShare"
            Write-Host "-WinPE Auto ExtraFiles: $WinPEAutoExtraFiles"
            Write-Host "-WinPE OSDCloud: $WinPEOSDCloud"
            Write-Host "-WinRE WiFi $WinREWiFi"
            Write-Host "-WinPE DaRT: $WinPEDaRT"
            Write-Host "-WinPE Scratch Space: $ScratchSpace"
            Write-Host "-WinPE Source Wim: $SourceWim"
            Write-Host "-WinPE Drivers:"
            if ($WinPEDrivers) {foreach ($item in $WinPEDrivers) {Write-Host -ForegroundColor DarkGray "$item"}}
            Write-Host "-WinPE Extra Files:"
            if ($WinPEExtraFiles) {foreach ($item in $WinPEExtraFiles) {Write-Host -ForegroundColor DarkGray "$item"}}
            Write-Host "-WinPE Scripts:"
            if ($WinPEScripts) {foreach ($item in $WinPEScripts) {Write-Host -ForegroundColor DarkGray "$item"}}
            Write-Host "-WinPE ADK Pkgs:"
            if ($WinPEADK) {foreach ($item in $WinPEADK) {Write-Host -ForegroundColor DarkGray "$item"}}

<# #=================================================
            Write-Verbose '19.1.1 Validate Proper TaskVersion'
            #=================================================
            if ([System.Version]$TaskVersion -lt [System.Version]"18.10.10") {
                Write-Host '========================================================================================' -ForegroundColor DarkGray
                Write-Warning "PEBuild Tasks need to be version 18.10.10 or newer"
                Write-Warning "Recreate this Task using New-PEBuildTask"
                Return
            } #>


            #=================================================
            Write-Verbose '19.1.1 Validate Proper TaskVersion'
            #=================================================
            if ([System.Version]$TaskVersion -lt [System.Version]"19.1.4.0") {
                Write-Host '========================================================================================' -ForegroundColor DarkGray
                Write-Warning "PEBuild Tasks need to be version 19.1.4.0 or newer"
                Write-Warning "Recreate this Task using New-PEBuildTask or Repair-PEBuildTask"
                Return
            }
            
            #=================================================
            Write-Verbose '19.3.22 Select Latest OSMedia'
            #=================================================
            $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 -Revision OK | Where-Object {$_.OSMFamily -eq $TaskOSMFamily}
            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
            }
            
            #=================================================
            Write-Verbose '19.1.1 Set Proper Paths'
            #=================================================
            $OSSourcePath = $OSMediaPath
            $OSImagePath = "$OSSourcePath\OS\sources\install.wim"

            #=================================================
            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 "-Source Path: $OSSourcePath"
            Write-Host "-Image File: $OSImagePath"
            Write-Host "-Image Index: $OSImageIndex"
            Write-Host "-Image 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"
            #=================================================
            # Operating System
            #=================================================
            $UpdateOS = ''
            if ($OSMajorVersion -eq 10) {
                if ($OSInstallationType -match 'Server') {
                    $UpdateOS = 'Windows Server'
                }
                else {
                    if ($OSImageName -match ' 11 ') {
                        $UpdateOS = 'Windows 11'
                    }
                    else {
                        $UpdateOS = 'Windows 10'
                    }
                }
            }
            #=================================================
            Write-Verbose '19.1.1 Set DestinationName'
            #=================================================
            if ($WinPEOutput -eq 'Recovery') {
                $DestinationName = "Microsoft Windows Recovery Environment ($OSArchitecture)"
            } else {
                $DestinationName = "Microsoft Windows PE ($OSArchitecture)"
            }
            Write-Host "-Destination Name: $DestinationName"

            #=================================================
            Write-Verbose '19.1.1 Validate Registry CurrentVersion.xml'
            #=================================================
            if (Test-Path "$OSSourcePath\info\xml\CurrentVersion.xml") {
                $RegKeyCurrentVersion = Import-Clixml -Path "$OSSourcePath\info\xml\CurrentVersion.xml"
                $ReleaseId = $($RegKeyCurrentVersion.ReleaseId)
            }

            #=================================================
            # Set ReleaseID
            #=================================================
            if ($OSBuild -eq 7600) {$ReleaseId = 7600}
            if ($OSBuild -eq 7601) {$ReleaseId = 7601}
            if ($OSBuild -eq 10240) {$ReleaseId = 1507}
            if ($OSBuild -eq 14393) {$ReleaseId = 1607}
            if ($OSBuild -eq 15063) {$ReleaseId = 1703}
            if ($OSBuild -eq 16299) {$ReleaseId = 1709}
            if ($OSBuild -eq 17134) {$ReleaseId = 1803}
            if ($OSBuild -eq 17763) {$ReleaseId = 1809}
            if ($OSBuild -eq 18362) {$ReleaseId = 1903}
            if ($OSBuild -eq 18363) {$ReleaseId = 1909}
            if ($OSBuild -eq 19041) {$ReleaseId = 2004}
            if ($OSBuild -eq 19042) {$ReleaseId = '20H2'}
            if ($OSBuild -eq 19043) {$ReleaseId = '21H1'}
            if ($OSBuild -eq 19044) {$ReleaseId = '21H2'}
            if ($OSBuild -eq 22000) {$ReleaseId = '21H2'}
            if ($OSBuild -eq 20348) {$ReleaseId = '21H2'}
            if ($OSBuild -eq 22621) {$ReleaseId = '22H2'}
            #=================================================
            Write-Verbose '19.1.1 Set Working Path'
            #=================================================
            #$BuildName = "build$((Get-Date).ToString('mmss'))"
            $WorkingPath = "$SetOSDBuilderPathPEBuilds\$Taskname $($LatestOSMedia.UBR)"
            if ($CustomName) {
                $WorkingPath = "$SetOSDBuilderPathPEBuilds\$CustomName"
            }

            #=================================================
            Write-Verbose '19.1.1 Validate DeploymentShare'
            #=================================================
            if ($MDTDeploymentShare) {
                if (!(Test-Path "$MDTDeploymentShare")) {
                    Write-Warning "MDT Deployment Share not found ... Exiting!"
                    Return
                }
            }

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

                #=================================================
                Write-Verbose '19.1.1 Remove Existing OSMedia'
                #=================================================
                if (Test-Path $WorkingPath) {
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Warning "$WorkingPath exists. Contents will be replaced"
                    Remove-Item -Path "$WorkingPath\*" -Force -Recurse | Out-Null
                }

                #=================================================
                Write-Verbose '19.3.21 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}

                $Sources = "$OS\sources"
                if (!(Test-Path "$Sources")) {New-Item "$Sources" -ItemType Directory -Force | Out-Null}

                $Logs = Join-Path $Info 'logs'
                $PEInfo = $Info
                $PELogs = $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}

                $WorkingWim = "$WorkingPath\WimTemp\boot.wim"

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

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

                #=================================================
                # Copy Media
                #=================================================
                Write-Host '========================================================================================' -ForegroundColor DarkGray
                Show-ActionTime; Write-Host "Copying $OSSourcePath\OS to $OS" -ForegroundColor Green
                Copy-Item -Path "$OSSourcePath\OS\bootmgr" -Destination "$OS\bootmgr" -Force | Out-Null
                Copy-Item -Path "$OSSourcePath\OS\bootmgr.efi" -Destination "$OS\bootmgr.efi" -Force | Out-Null
                Copy-Item -Path "$OSSourcePath\OS\boot\" -Destination "$OS\boot\" -Recurse -Force | Out-Null
                Copy-Item -Path "$OSSourcePath\OS\efi\" -Destination "$OS\efi\" -Recurse -Force | Out-Null
                Dism /Export-Image /SourceImageFile:"$OSSourcePath\WinPE\$SourceWim.wim" /SourceIndex:1 /DestinationImageFile:"$WorkingWim" /DestinationName:"$DestinationName" /Bootable /CheckIntegrity | Out-Null
                #Copy-Item -Path "$OSSourcePath\WinPE\$SourceWim.wim" -Destination "$WorkingWim" -Force | Out-Null
                if (!(Test-Path "$Sources")) {New-Item "$Sources" -ItemType Directory -Force | Out-Null}
                
                #=================================================
                # Mount-WindowsImage
                #=================================================
                Mount-PEBuild -MountDirectory $MountDirectory -WorkingWim $WorkingWim
                #=================================================
                # PauseMount
                #=================================================
                if ($PauseMount.IsPresent){[void](Read-Host 'Press Enter to Continue')}
                #=================================================
                # Get-RegCurrentVersion
                #=================================================
                $RegKeyCurrentVersion = Get-RegCurrentVersion -Path $MountDirectory

                $RegValueDisplayVersion = ($RegKeyCurrentVersion).DisplayVersion
                #$ReleaseId = ($RegKeyCurrentVersion).ReleaseId
                #if ($RegValueDisplayVersion) {$ReleaseId = $RegValueDisplayVersion}
                #=================================================
                # Get Registry and UBR
                #=================================================
                $RegKeyCurrentVersionUBR = $($RegKeyCurrentVersion.UBR)
                $UBR = "$OSBuild.$RegKeyCurrentVersionUBR"

                $RegKeyCurrentVersion | Out-File "$Info\CurrentVersion.txt"
                $RegKeyCurrentVersion | Out-File "$WorkingPath\CurrentVersion.txt"
                $RegKeyCurrentVersion | Out-File "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-CurrentVersion.txt"
                $RegKeyCurrentVersion | Export-Clixml -Path "$Info\xml\CurrentVersion.xml"
                $RegKeyCurrentVersion | Export-Clixml -Path "$Info\xml\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-CurrentVersion.xml"
                $RegKeyCurrentVersion | ConvertTo-Json | Out-File "$Info\json\CurrentVersion.json"
                $RegKeyCurrentVersion | ConvertTo-Json | Out-File "$Info\json\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-CurrentVersion.json"
                #=================================================
                # Set-PEBuildScratchSpace Set-PEBuildTargetPath
                #=================================================
                Set-PEBuildScratchSpace -MountDirectory $MountDirectory -ScratchSpace $ScratchSpace
                Set-PEBuildTargetPath -MountDirectory $MountDirectory
                #=================================================
                # WinPE ContentPacks
                #=================================================
                if (Get-IsContentPacksEnabled) {
                    Add-ContentPack -PackType PEDaRT
                    Add-ContentPack -PackType PEADK
                    #Add-ContentPack -PackType PEADK -WinPEOutput $WinPEOutput -SourceWim $SourceWim
                    #Add-ContentPack -PackType PEDrivers
                    #Add-ContentPack -PackType PEExtraFiles
                    #Add-ContentPack -PackType PEPoshMods
                    #Add-ContentPack -PackType PERegistry
                    #Add-ContentPack -PackType PEScripts
                }
                $WinPEADKPE = $WinPEADK
                Add-ContentADKWinPE
                Expand-DaRTPE
                #=================================================
                Write-Verbose '19.1.1 WinPE: ADK Optional Components'
                #=================================================
<# Write-Host '========================================================================================' -ForegroundColor DarkGray
                Write-Host "WinPE: ADK Optional Components" -ForegroundColor Green
                if ([string]::IsNullOrEmpty($WinPEADK) -or [string]::IsNullOrWhiteSpace($WinPEADK)) {
                    # Do Nothing
                } else {
                    foreach ($PackagePath in $WinPEADK) {
                        if ($PackagePath -like "*NetFx*") {
                            Write-Host "$SetOSDBuilderPathContent\$PackagePath" -ForegroundColor Green
                            Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountDirectory" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-WindowsPackage.log" | Out-Null
                        }
                    }
                    $WinPEADK = $WinPEADK | Where-Object {$_ -notlike "*NetFx*"}
                    foreach ($PackagePath in $WinPEADK) {
                        if ($PackagePath -like "*WinPE-PowerShell*") {
                            Write-Host "$SetOSDBuilderPathContent\$PackagePath" -ForegroundColor Green
                            Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountDirectory" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-WindowsPackage.log" | Out-Null
                        }
                    }
                    $WinPEADK = $WinPEADK | Where-Object {$_ -notlike "*PowerShell*"}
                    foreach ($PackagePath in $WinPEADK) {
                        Write-Host "$SetOSDBuilderPathContent\$PackagePath" -ForegroundColor Green
                        Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountDirectory" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-WindowsPackage.log" | Out-Null
                    }
                } #>


<# #=================================================
                Write-Verbose '19.1.1 WinPE: WinPE DaRT'
                #=================================================
                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 "$SetOSDBuilderPathContent\$WinPEDaRT") {
                        #=================================================
                        if (Test-Path $(Join-Path $(Split-Path "$SetOSDBuilderPathContent\$WinPEDart") 'DartConfig.dat')) {
                            Write-Host "$SetOSDBuilderPathContent\$WinPEDaRT"
                            expand.exe "$SetOSDBuilderPathContent\$WinPEDaRT" -F:*.* "$MountDirectory"
                            #if (Test-Path "$MountDirectory\Windows\System32\winpeshl.ini") {Remove-Item -Path "$MountDirectory\Windows\System32\winpeshl.ini" -Force}
                            #=================================================
                            Write-Host "Copying DartConfig.dat to $MountDirectory\Windows\System32\DartConfig.dat"
                            Copy-Item -Path $(Join-Path $(Split-Path "$SetOSDBuilderPathContent\$WinPEDart") 'DartConfig.dat') -Destination "$MountDirectory\Windows\System32\DartConfig.dat" -Force | Out-Null
                            #=================================================
                        } elseif (Test-Path $(Join-Path $(Split-Path $SetOSDBuilderPathContent\$WinPEDart) 'DartConfig8.dat')) {
                            Write-Host "$SetOSDBuilderPathContent\$WinPEDaRT"
                            expand.exe "$SetOSDBuilderPathContent\$WinPEDaRT" -F:*.* "$MountDirectory"
                            #if (Test-Path "$MountDirectory\Windows\System32\winpeshl.ini") {Remove-Item -Path "$MountDirectory\Windows\System32\winpeshl.ini" -Force}
                            #=================================================
                            Write-Host "Copying DartConfig8.dat to $MountDirectory\Windows\System32\DartConfig.dat"
                            Copy-Item -Path $(Join-Path $(Split-Path "$SetOSDBuilderPathContent\$WinPEDart") 'DartConfig8.dat') -Destination "$MountDirectory\Windows\System32\DartConfig.dat" -Force | Out-Null
                            #=================================================
                        } else {
                            Write-Warning "DartConfig.dat or DartConfig8.dat were not found. Unable to integrate"
                        }
                        #=================================================
                        Write-Verbose '19.1.1 WinPE Edit winpeshl.ini'
                        #=================================================
                        if ($WinPEOutput -eq 'Recovery') {
                            Write-Host '========================================================================================' -ForegroundColor DarkGray
                            Write-Host "WinPE: Edit winpeshl.ini" -ForegroundColor Green
                            if (Test-Path "$MountDirectory\Windows\System32\winpeshl.ini") {
                                Remove-Item -Path "$MountDirectory\Windows\System32\winpeshl.ini" -Force | Out-Null
                            }
                            $DaRTwinpeshl | Out-File "$MountDirectory\Windows\System32\winpeshl.ini" -Force
                        }
                        #=================================================
                    } else {Write-Warning "WinPE DaRT do not exist in $SetOSDBuilderPathContent\$WinPEDart"}
                } #>

<# #=================================================
                Write-Verbose '19.1.1 WinPE Remove winpeshl.ini'
                #=================================================
                if ($WinPEOutput -ne 'Recovery') {
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "WinPE: Remove winpeshl.ini" -ForegroundColor Green
                    if (Test-Path "$MountDirectory\Windows\System32\winpeshl.ini") {
                        Remove-Item -Path "$MountDirectory\Windows\System32\winpeshl.ini" -Force | Out-Null
                    }
                } #>

                
                #=================================================
                Write-Verbose '19.1.1 Copy MDT'
                #=================================================
                if ($MDTDeploymentShare) {
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Write-Host "WinPE: Copy MDT Deployment Share from $MDTDeploymentShare" -ForegroundColor Green
                    $MDTwinpeshl | Out-File "$MountDirectory\Windows\System32\winpeshl.ini" -Force

                    if ($OSArchitecture -eq 'x86') {$MDTUnattendPEx86 | Out-File "$MountDirectory\Unattend.xml" -Encoding utf8 -Force}
                    if ($OSArchitecture -eq 'x64') {$MDTUnattendPEx64 | Out-File "$MountDirectory\Unattend.xml" -Encoding utf8 -Force}

                    New-Item -Path "$MountDirectory\Deploy\Scripts" -ItemType Directory -Force | Out-Null
                    New-Item -Path "$MountDirectory\Deploy\Tools\$OSArchitecture\00000409" -ItemType Directory -Force | Out-Null

                    Copy-Item -Path "$MDTDeploymentShare\Control\Bootstrap.ini" -Destination "$MountDirectory\Deploy\Scripts\Bootstrap.ini" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Control\LocationServer.xml" -Destination "$MountDirectory\Deploy\Scripts\LocationServer.xml" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\BDD_Welcome_ENU.xml" -Destination "$MountDirectory\Deploy\Scripts\BDD_Welcome_ENU.xml" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\BackButton.jpg" -Destination "$MountDirectory\Deploy\Scripts\BackButton.jpg" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\BackButton.png" -Destination "$MountDirectory\Deploy\Scripts\BackButton.png" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\Computer.png" -Destination "$MountDirectory\Deploy\Scripts\Computer.png" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\Credentials_ENU.xml" -Destination "$MountDirectory\Deploy\Scripts\Credentials_ENU.xml" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\Credentials_scripts.vbs" -Destination "$MountDirectory\Deploy\Scripts\Credentials_scripts.vbs" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\DeployWiz_Administrator.png" -Destination "$MountDirectory\Deploy\Scripts\DeployWiz_Administrator.png" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\FolderIcon.png" -Destination "$MountDirectory\Deploy\Scripts\FolderIcon.png" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\ItemIcon1.png" -Destination "$MountDirectory\Deploy\Scripts\ItemIcon1.png" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\LTICleanup.wsf" -Destination "$MountDirectory\Deploy\Scripts\LTICleanup.wsf" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\LTIGetFolder.wsf" -Destination "$MountDirectory\Deploy\Scripts\LTIGetFolder.wsf" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\LiteTouch.wsf" -Destination "$MountDirectory\Deploy\Scripts\LiteTouch.wsf" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\MinusIcon1.png" -Destination "$MountDirectory\Deploy\Scripts\MinusIcon1.png" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\NICSettings_Definition_ENU.xml" -Destination "$MountDirectory\Deploy\Scripts\NICSettings_Definition_ENU.xml" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\NavBar.png" -Destination "$MountDirectory\Deploy\Scripts\NavBar.png" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\PlusIcon1.png" -Destination "$MountDirectory\Deploy\Scripts\PlusIcon1.png" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\SelectItem.jpg" -Destination "$MountDirectory\Deploy\Scripts\SelectItem.jpg" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\SelectItem.png" -Destination "$MountDirectory\Deploy\Scripts\SelectItem.png" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\Summary_Definition_ENU.xml" -Destination "$MountDirectory\Deploy\Scripts\Summary_Definition_ENU.xml" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\Summary_scripts.vbs" -Destination "$MountDirectory\Deploy\Scripts\Summary_scripts.vbs" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\WelcomeBanner.jpg" -Destination "$MountDirectory\Deploy\Scripts\WelcomeBanner.jpg" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\WelcomeWiz_Background.jpg" -Destination "$MountDirectory\Deploy\Scripts\WelcomeWiz_Background.jpg" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\WelcomeWiz_Choice.vbs" -Destination "$MountDirectory\Deploy\Scripts\WelcomeWiz_Choice.vbs" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\WelcomeWiz_Choice.xml" -Destination "$MountDirectory\Deploy\Scripts\WelcomeWiz_Choice.xml" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\WelcomeWiz_DeployRoot.vbs" -Destination "$MountDirectory\Deploy\Scripts\WelcomeWiz_DeployRoot.vbs" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\WelcomeWiz_DeployRoot.xml" -Destination "$MountDirectory\Deploy\Scripts\WelcomeWiz_DeployRoot.xml" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\WelcomeWiz_Initialize.vbs" -Destination "$MountDirectory\Deploy\Scripts\WelcomeWiz_Initialize.vbs" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\WelcomeWiz_Initialize.xml" -Destination "$MountDirectory\Deploy\Scripts\WelcomeWiz_Initialize.xml" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\WizUtility.vbs" -Destination "$MountDirectory\Deploy\Scripts\WizUtility.vbs" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\Wizard.css" -Destination "$MountDirectory\Deploy\Scripts\Wizard.css" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\Wizard.hta" -Destination "$MountDirectory\Deploy\Scripts\Wizard.hta" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\Wizard.ico" -Destination "$MountDirectory\Deploy\Scripts\Wizard.ico" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\ZTIBCDUtility.vbs" -Destination "$MountDirectory\Deploy\Scripts\ZTIBCDUtility.vbs" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\ZTIConfigFile.vbs" -Destination "$MountDirectory\Deploy\Scripts\ZTIConfigFile.vbs" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\ZTIDataAccess.vbs" -Destination "$MountDirectory\Deploy\Scripts\ZTIDataAccess.vbs" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\ZTIDiskUtility.vbs" -Destination "$MountDirectory\Deploy\Scripts\ZTIDiskUtility.vbs" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\ZTIGather.wsf" -Destination "$MountDirectory\Deploy\Scripts\ZTIGather.wsf" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\ZTIGather.xml" -Destination "$MountDirectory\Deploy\Scripts\ZTIGather.xml" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\ZTINicConfig.wsf" -Destination "$MountDirectory\Deploy\Scripts\ZTINicConfig.wsf" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\ZTINicUtility.vbs" -Destination "$MountDirectory\Deploy\Scripts\ZTINicUtility.vbs" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\ZTIUtility.vbs" -Destination "$MountDirectory\Deploy\Scripts\ZTIUtility.vbs" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\btnout.png" -Destination "$MountDirectory\Deploy\Scripts\btnout.png" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\btnover.png" -Destination "$MountDirectory\Deploy\Scripts\btnover.png" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\btnsel.png" -Destination "$MountDirectory\Deploy\Scripts\btnsel.png" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\header-image.png" -Destination "$MountDirectory\Deploy\Scripts\header-image.png" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\minusico.gif" -Destination "$MountDirectory\Deploy\Scripts\minusico.gif" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Scripts\plusicon.gif" -Destination "$MountDirectory\Deploy\Scripts\plusicon.gif" -Force -ErrorAction SilentlyContinue | Out-Null

                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\00000409\tsres.dll" -Destination "$MountDirectory\Deploy\Tools\$OSArchitecture\00000409\tsres.dll" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\BDDRUN.exe" -Destination "$MountDirectory\Windows\system32\BDDRUN.exe" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\BGInfo.exe" -Destination "$MountDirectory\Windows\system32\BGInfo.exe" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\BGInfo64.exe" -Destination "$MountDirectory\Windows\system32\BGInfo64.exe" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\CcmCore.dll" -Destination "$MountDirectory\Deploy\Tools\$OSArchitecture\CcmCore.dll" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\CcmUtilLib.dll" -Destination "$MountDirectory\Deploy\Tools\$OSArchitecture\CcmUtilLib.dll" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\Microsoft.BDD.Utility.dll" -Destination "$MountDirectory\Deploy\Tools\$OSArchitecture\Microsoft.BDD.Utility.dll" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\SmsCore.dll" -Destination "$MountDirectory\Deploy\Tools\$OSArchitecture\SmsCore.dll" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\Smsboot.exe" -Destination "$MountDirectory\Deploy\Tools\$OSArchitecture\Smsboot.exe" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\TSEnv.exe" -Destination "$MountDirectory\Deploy\Tools\$OSArchitecture\TSEnv.exe" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\TSResNlc.dll" -Destination "$MountDirectory\Deploy\Tools\$OSArchitecture\TSResNlc.dll" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\TsCore.dll" -Destination "$MountDirectory\Deploy\Tools\$OSArchitecture\TsCore.dll" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\TsManager.exe" -Destination "$MountDirectory\Deploy\Tools\$OSArchitecture\TsManager.exe" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\TsMessaging.dll" -Destination "$MountDirectory\Deploy\Tools\$OSArchitecture\TsMessaging.dll" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\TsProgressUI.exe" -Destination "$MountDirectory\Deploy\Tools\$OSArchitecture\TsProgressUI.exe" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\TsmBootstrap.exe" -Destination "$MountDirectory\Deploy\Tools\$OSArchitecture\TsmBootstrap.exe" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\WinRERUN.exe" -Destination "$MountDirectory\Deploy\Tools\$OSArchitecture\WinRERUN.exe" -Force -ErrorAction SilentlyContinue | Out-Null

                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\xprslib.dll" -Destination "$MountDirectory\Deploy\Tools\$OSArchitecture\xprslib.dll" -Force -ErrorAction SilentlyContinue | Out-Null

                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\CommonUtils.dll" -Destination "$MountDirectory\Deploy\Tools\$OSArchitecture\CommonUtils.dll" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\ccmgencert.dll" -Destination "$MountDirectory\Deploy\Tools\$OSArchitecture\ccmgencert.dll" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\msvcp120.dll" -Destination "$MountDirectory\Deploy\Tools\$OSArchitecture\msvcp120.dll" -Force -ErrorAction SilentlyContinue | Out-Null
                    Copy-Item -Path "$MDTDeploymentShare\Tools\$OSArchitecture\msvcr120.dll" -Destination "$MountDirectory\Deploy\Tools\$OSArchitecture\msvcr120.dll" -Force -ErrorAction SilentlyContinue | Out-Null
                    #[void](Read-Host 'Press Enter to Continue')
                }
                #=================================================
                # Auto ExtraFiles
                #=================================================
                if ($WinPEAutoExtraFiles -eq $true) {
                    Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: Copy Auto ExtraFiles from $OSSourcePath\WinPE\AutoExtraFiles"
                    #robocopy "$OSSourcePath\WinPE\AutoExtraFiles" "$MountDirectory" *.* /s /ndl /xf bcp47*.dll /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-AutoExtraFiles.log" | Out-Null
                }
                #=================================================
                # Enable-WinPEOSDCloud
                #=================================================
                if ($WinPEOSDCloud -eq $true) {Enable-WinPEOSDCloud}
                #=================================================
                # Enable-WinREWiFi
                #=================================================
                if ($WinREWiFi -eq $true) {Enable-WinREWiFi}
                #=================================================
                # PEExtraFiles
                #=================================================
                if ($WinPEExtraFiles) {
                    Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: Task PEExtraFiles"
                    foreach ($ExtraFile in $WinPEExtraFiles) {
                        Write-Host "Source: $SetOSDBuilderPathContent\$ExtraFile" -ForegroundColor DarkGray
                        #robocopy "$SetOSDBuilderPathContent\$ExtraFile" "$MountDirectory" *.* /s /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ExtraFiles.log" | Out-Null
                        #robocopy "$SetOSDBuilderPathContent\$ExtraFile" "$MountDirectory" *.* /XD "WindowsPowerShell" /S /ZB /COPY:D /NODCOPY /XJ /NDL /NP /TEE /TS /XX /R:0 /W:0 /LOG+:"$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ExtraFiles.log" | Out-Null
                    }
                }
                if (Get-IsContentPacksEnabled) {
                    Add-ContentPack -PackType PEExtraFiles
                }
                #=================================================
                # PEDrivers
                #=================================================
                if ($WinPEDrivers) {
                    Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: Task Drivers"
                    foreach ($WinPEDriver in $WinPEDrivers) {
                        Write-Host "$SetOSDBuilderPathContent\$WinPEDriver" -ForegroundColor Green
                        Add-WindowsDriver -Path "$MountDirectory" -Driver "$SetOSDBuilderPathContent\$WinPEDriver" -Recurse -ForceUnsigned -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-WindowsDriver.log" | Out-Null
                    }
                }
                if (Get-IsContentPacksEnabled) {
                    Add-ContentPack -PackType PEDrivers
                }
                #=================================================
                # Scripts
                #=================================================
                if ($WinPEScripts) {
                    Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: Task PowerShell Scripts"
                    foreach ($PSWimScript in $WinPEScripts) {
                        if (Test-Path "$SetOSDBuilderPathContent\$PSWimScript") {
                            Write-Host "$SetOSDBuilderPathContent\$PSWimScript" -ForegroundColor Green
                            Invoke-Expression "& '$SetOSDBuilderPathContent\$PSWimScript'"
                        }
                    }
                }
                if (Get-IsContentPacksEnabled) {
                    Add-ContentPack -PackType PEScripts
                }
                #=================================================
                # PEPoshMods
                #=================================================
                if (Get-IsContentPacksEnabled) {
                    Add-ContentPack -PackType PEPoshMods
                }
                #=================================================
                # Registry
                #=================================================
                if (Get-IsContentPacksEnabled) {
                    Add-ContentPack -PackType PERegistry
                }
                #=================================================
                Write-Verbose '19.1.1 WinPE Mounted Package Inventory'
                #=================================================
                Write-Host '========================================================================================' -ForegroundColor DarkGray
                Write-Host "WinPE: Export Package Inventory" -ForegroundColor Green
                Write-Host "$Info\WindowsPackage.txt"
                $GetWindowsPackage = Get-WindowsPackage -Path "$MountDirectory"
                $GetWindowsPackage | Out-File "$Info\WindowsPackage.txt"
                $GetWindowsPackage | Out-File "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Get-WindowsPackage.txt"
                $GetWindowsPackage | Export-Clixml -Path "$Info\xml\Get-WindowsPackage.xml"
                $GetWindowsPackage | Export-Clixml -Path "$Info\xml\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Get-WindowsPackage.xml"
                $GetWindowsPackage | ConvertTo-Json | Out-File "$Info\json\Get-WindowsPackage.json"
                $GetWindowsPackage | ConvertTo-Json | Out-File "$Info\json\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Get-WindowsPackage.json"
                #=================================================
                Write-Verbose '19.1.1 WinPE Dismount and Save'
                #=================================================
                Write-Host '========================================================================================' -ForegroundColor DarkGray
                Write-Host "WinPE: Dismount and Save" -ForegroundColor Green
                if ($PauseDismount.IsPresent){[void](Read-Host 'Press Enter to Continue')}
                Dismount-WindowsImage -Path "$MountDirectory" -Save -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dismount-WindowsImage.log" | Out-Null
                #=================================================
                Write-Verbose '19.1.1 Export WinPE'
                #=================================================
                Write-Host '========================================================================================' -ForegroundColor DarkGray
                Write-Host "Export Boot.wim to $OS\sources\boot.wim" -ForegroundColor Green
                Export-WindowsImage -SourceImagePath "$WimTemp\boot.wim" -SourceIndex 1 -DestinationImagePath "$OS\sources\boot.wim" -Setbootable -DestinationName "$TaskName" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Export-WindowsImage.log" | Out-Null
                
                if ($WinPEOutput -eq 'MDT') {
                    Export-WindowsImage -SourceImagePath "$WimTemp\boot.wim" -SourceIndex 1 -DestinationImagePath "$WorkingPath\LiteTouchPE_$OSArchitecture.wim" -Setbootable -DestinationName "$TaskName" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Export-WindowsImage.log" | Out-Null
                }
                if ($WinPEOutput -eq 'Recovery') {
                    Export-WindowsImage -SourceImagePath "$WimTemp\boot.wim" -SourceIndex 1 -DestinationImagePath "$WorkingPath\WinRE.wim" -Setbootable -DestinationName "$TaskName" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Export-WindowsImage.log" | Out-Null
                }
                if ($WinPEOutput -eq 'WinPE') {
                    Export-WindowsImage -SourceImagePath "$WimTemp\boot.wim" -SourceIndex 1 -DestinationImagePath "$WorkingPath\WinPE.wim" -Setbootable -DestinationName "$TaskName" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Export-WindowsImage.log" | Out-Null
                }
                #=================================================
                Write-Verbose '19.1.1 Export Boot.wim Configuration'
                #=================================================
                Write-Host '========================================================================================' -ForegroundColor DarkGray
                Write-Host "Export Boot.wim Configuration to $WorkingPath\WindowsImage.txt" -ForegroundColor Green
                $GetWindowsImage = @()
                $GetWindowsImage = Get-WindowsImage -ImagePath "$OS\sources\boot.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"

                #=================================================
                # OSD-Export
                #=================================================
                Save-WindowsImageContentPE
                Save-VariablesOSD

                #=================================================
                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}
                
                #=================================================
                Write-Verbose '19.1.1 New-OSDBuilderISO'
                #=================================================
                if ($CreateISO.IsPresent) {
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    New-OSDBuilderISO -FullName "$WorkingPath"
                }
                
                #=================================================
                Write-Verbose '19.1.1 Show-OSDBuilderInfo'
                #=================================================
                if ($OSDInfo.IsPresent) {
                    Write-Host '========================================================================================' -ForegroundColor DarkGray
                    Show-OSDBuilderInfo -FullName $WorkingPath
                }

                #=================================================
                Write-Verbose '19.1.1 Stop Transcript'
                #=================================================
                Write-Host '========================================================================================' -ForegroundColor DarkGray
                Stop-Transcript
            }
        }
    }

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