Private/AllFunctions.ps1
function Add-ContentADKWinPE { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if (($ScriptName -ne 'New-OSBuild') -and ($ScriptName -ne 'New-PEBuild')) {Return} if ([string]::IsNullOrWhiteSpace($WinPEADKPE)) {Return} $global:ReapplyLCU = $true #=================================================================================================== # Execute #=================================================================================================== Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: WinPE.wim ADK Optional Components" $WinPEADKPE = $WinPEADKPE | Sort-Object Length foreach ($PackagePath in $WinPEADKPE) { if ($PackagePath -like "*WinPE-NetFx*") { $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentADKWinPE.log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "$SetOSDBuilderPathContent\$PackagePath" -ForegroundColor DarkGray Try {Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountWinPE" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } $WinPEADKPE = $WinPEADKPE | Where-Object {$_.Name -notlike "*WinPE-NetFx*"} foreach ($PackagePath in $WinPEADKPE) { if ($PackagePath -like "*WinPE-PowerShell*") { $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentADKWinPE.log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "$SetOSDBuilderPathContent\$PackagePath" -ForegroundColor DarkGray Try {Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountWinPE" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } $WinPEADKPE = $WinPEADKPE | Where-Object {$_.Name -notlike "*WinPE-PowerShell*"} foreach ($PackagePath in $WinPEADKPE) { Write-Host "$SetOSDBuilderPathContent\$PackagePath" -ForegroundColor DarkGray $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentADKWinPE.log" Write-Verbose "CurrentLog: $CurrentLog" if ($OSMajorVersion -eq 6) { dism /Image:"$MountWinPE" /Add-Package /PackagePath:"$SetOSDBuilderPathContent\$PackagePath" /LogPath:"$CurrentLog" } else { Try {Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountWinPE" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } } function Add-ContentADKWinRE { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if (($ScriptName -ne 'New-OSBuild') -and ($ScriptName -ne 'New-PEBuild')) {Return} if ([string]::IsNullOrWhiteSpace($WinPEADKRE)) {Return} $global:ReapplyLCU = $true #=================================================================================================== # Execute #=================================================================================================== Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: WinRE.wim ADK Optional Components" $WinPEADKRE = $WinPEADKRE | Sort-Object Length foreach ($PackagePath in $WinPEADKRE) { $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentADKWinRE.log" Write-Verbose "CurrentLog: $CurrentLog" if ($PackagePath -like "*WinPE-NetFx*") { Write-Host "$SetOSDBuilderPathContent\$PackagePath" -ForegroundColor DarkGray Try {Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountWinRE" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } $WinPEADKRE = $WinPEADKRE | Where-Object {$_.Name -notlike "*WinPE-NetFx*"} foreach ($PackagePath in $WinPEADKRE) { $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentADKWinRE.log" Write-Verbose "CurrentLog: $CurrentLog" if ($PackagePath -like "*WinPE-PowerShell*") { Write-Host "$SetOSDBuilderPathContent\$PackagePath" -ForegroundColor DarkGray Try {Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountWinRE" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } $WinPEADKRE = $WinPEADKRE | Where-Object {$_.Name -notlike "*WinPE-PowerShell*"} foreach ($PackagePath in $WinPEADKRE) { $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentADKWinRE.log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "$SetOSDBuilderPathContent\$PackagePath" -ForegroundColor DarkGray if ($OSMajorVersion -eq 6) { dism /Image:"$MountWinRE" /Add-Package /PackagePath:"$SetOSDBuilderPathContent\$PackagePath" /LogPath:"$CurrentLog" } else { Try {Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountWinRE" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } } function Add-ContentADKWinSE { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if (($ScriptName -ne 'New-OSBuild') -and ($ScriptName -ne 'New-PEBuild')) {Return} if ([string]::IsNullOrWhiteSpace($WinPEADKSE)) {Return} $global:ReapplyLCU = $true #=================================================================================================== # Header #=================================================================================================== Show-ActionTime Write-Host -ForegroundColor Green "WinPE: WinSE.wim ADK Optional Components" #=================================================================================================== # Execute #=================================================================================================== $WinPEADKSE = $WinPEADKSE | Sort-Object Length foreach ($PackagePath in $WinPEADKSE) { $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentADKWinSE.log" Write-Verbose "CurrentLog: $CurrentLog" if ($PackagePath -like "*WinPE-NetFx*") { Write-Host "$SetOSDBuilderPathContent\$PackagePath" -ForegroundColor DarkGray Try {Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountWinSE" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } $WinPEADKSE = $WinPEADKSE | Where-Object {$_.Name -notlike "*WinPE-NetFx*"} foreach ($PackagePath in $WinPEADKSE) { $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentADKWinSE.log" Write-Verbose "CurrentLog: $CurrentLog" if ($PackagePath -like "*WinPE-PowerShell*") { Write-Host "$SetOSDBuilderPathContent\$PackagePath" -ForegroundColor DarkGray Try {Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountWinSE" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } $WinPEADKSE = $WinPEADKSE | Where-Object {$_.Name -notlike "*WinPE-PowerShell*"} foreach ($PackagePath in $WinPEADKSE) { $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentADKWinSE.log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "$SetOSDBuilderPathContent\$PackagePath" -ForegroundColor DarkGray if ($OSMajorVersion -eq 6) { dism /Image:"$MountWinSE" /Add-Package /PackagePath:"$SetOSDBuilderPathContent\$PackagePath" /LogPath:"$CurrentLog.log" } else { Try {Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountWinSE" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } } function Add-ContentDriversOS { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if ($ScriptName -ne 'New-OSBuild') {Return} #=================================================================================================== # Task #=================================================================================================== if ($Drivers) { Show-ActionTime; Write-Host -ForegroundColor Green "OS: Drivers TASK" foreach ($Driver in $Drivers) { Write-Host "$SetOSDBuilderPathContent\$Driver" -ForegroundColor DarkGray $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentDriversOS-Task.log" Write-Verbose "CurrentLog: $CurrentLog" if ($OSMajorVersion -eq 6) { dism /Image:"$MountDirectory" /Add-Driver /Driver:"$SetOSDBuilderPathContent\$Driver" /Recurse /ForceUnsigned /LogPath:"$CurrentLog" } else { Try {Add-WindowsDriver -Driver "$SetOSDBuilderPathContent\$Driver" -Recurse -Path "$MountDirectory" -ForceUnsigned -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } } #=================================================================================================== # Template #=================================================================================================== if ($DriverTemplates) { Show-ActionTime; Write-Host -ForegroundColor Green "OS: Drivers TEMPLATE" foreach ($Driver in $DriverTemplates) { Write-Host "$($Driver.FullName)" -ForegroundColor DarkGray $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentDriversOS-Template.log" Write-Verbose "CurrentLog: $CurrentLog" if ($OSMajorVersion -eq 6) { dism /Image:"$MountDirectory" /Add-Driver /Driver:"$($Driver.FullName)" /Recurse /ForceUnsigned /LogPath:"$CurrentLog" } else { Try {Add-WindowsDriver -Driver "$($Driver.FullName)" -Recurse -Path "$MountDirectory" -ForceUnsigned -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } } } function Add-ContentDriversPE { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if ($ScriptName -ne 'New-OSBuild') {Return} #=================================================================================================== # Task #=================================================================================================== if ([string]::IsNullOrWhiteSpace($WinPEDrivers)) {Return} Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: Add-ContentDriversPE" foreach ($WinPEDriver in $WinPEDrivers) { Write-Host "$SetOSDBuilderPathContent\$WinPEDriver" -ForegroundColor DarkGray $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentDriversPE-Task.log" Write-Verbose "CurrentLog: $CurrentLog" if ($OSMajorVersion -eq 6) { dism /Image:"$MountWinPE" /Add-Driver /Driver:"$SetOSDBuilderPathContent\$WinPEDriver" /Recurse /ForceUnsigned /LogPath:"$CurrentLog" dism /Image:"$MountWinRE" /Add-Driver /Driver:"$SetOSDBuilderPathContent\$WinPEDriver" /Recurse /ForceUnsigned /LogPath:"$CurrentLog" dism /Image:"$MountWinSE" /Add-Driver /Driver:"$SetOSDBuilderPathContent\$WinPEDriver" /Recurse /ForceUnsigned /LogPath:"$CurrentLog" } else { Add-WindowsDriver -Path "$MountWinPE" -Driver "$SetOSDBuilderPathContent\$WinPEDriver" -Recurse -ForceUnsigned -LogPath "$CurrentLog" | Out-Null Add-WindowsDriver -Path "$MountWinRE" -Driver "$SetOSDBuilderPathContent\$WinPEDriver" -Recurse -ForceUnsigned -LogPath "$CurrentLog" | Out-Null Add-WindowsDriver -Path "$MountWinSE" -Driver "$SetOSDBuilderPathContent\$WinPEDriver" -Recurse -ForceUnsigned -LogPath "$CurrentLog" | Out-Null } } } function Add-ContentExtraFilesOS { [CmdletBinding()] Param () #=================================================================================================== # ABORT #=================================================================================================== if ($ScriptName -ne 'New-OSBuild') {Return} #=================================================================================================== # TASK #=================================================================================================== if ($ExtraFiles) { Show-ActionTime; Write-Host -ForegroundColor Green "OS: Extra Files TASK" foreach ($ExtraFile in $ExtraFiles) { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentExtraFilesOS-Task.log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "$SetOSDBuilderPathContent\$ExtraFile" -ForegroundColor DarkGray robocopy "$SetOSDBuilderPathContent\$ExtraFile" "$MountDirectory" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null } } #=================================================================================================== # TEMPLATE #=================================================================================================== if ($ExtraFilesTemplates) { Show-ActionTime; Write-Host -ForegroundColor Green "OS: Extra Files TEMPLATE" foreach ($ExtraFile in $ExtraFilesTemplates) { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentExtraFilesOS-Template.log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "$($ExtraFile.FullName)" -ForegroundColor DarkGray robocopy "$($ExtraFile.FullName)" "$MountDirectory" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null } } } function Add-ContentExtraFilesPE { [CmdletBinding()] Param () #=================================================================================================== # ABORT #=================================================================================================== if ($ScriptName -ne 'New-OSBuild') {Return} #=================================================================================================== # TASK #=================================================================================================== if ($WinPEExtraFilesPE -or $WinPEExtraFilesRE -or $WinPEExtraFilesSE) { Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: Extra Files TASK" foreach ($ExtraFile in $WinPEExtraFilesPE) { Write-Host "Source: $SetOSDBuilderPathContent\$ExtraFile" -ForegroundColor DarkGray $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentExtraFilesPE.log" Write-Verbose "CurrentLog: $CurrentLog" robocopy "$SetOSDBuilderPathContent\$ExtraFile" "$MountWinPE" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null } foreach ($ExtraFile in $WinPEExtraFilesRE) { Write-Host "Source: $SetOSDBuilderPathContent\$ExtraFile" -ForegroundColor DarkGray $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentExtraFilesPE.log" Write-Verbose "CurrentLog: $CurrentLog" robocopy "$SetOSDBuilderPathContent\$ExtraFile" "$MountWinRE" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null } foreach ($ExtraFile in $WinPEExtraFilesSE) { Write-Host "Source: $SetOSDBuilderPathContent\$ExtraFile" -ForegroundColor DarkGray $CurrentLog = "$PEInfo\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentExtraFilesPE.log" Write-Verbose "CurrentLog: $CurrentLog" robocopy "$SetOSDBuilderPathContent\$ExtraFile" "$MountWinSE" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null } } else { Return } } function Add-ContentPack { [CmdletBinding()] Param ( #[Alias('Path')] #[Parameter(Mandatory)] #[string]$ContentPackPath, [ValidateSet( 'MEDIA', 'OSCapability', 'OSDrivers', 'OSExtraFiles', 'OSLanguageFeatures', 'OSLanguagePacks', 'OSLocalExperiencePacks', 'OSPackages', 'OSPoshMods', 'OSRegistry', 'OSScripts', 'OSStartLayout', 'PEADK', 'PEADKLang', 'PEDaRT', 'PEDrivers', 'PEExtraFiles', 'PEPackages', 'PEPoshMods', 'PERegistry', 'PEScripts' )] [Alias('Type')] [string]$PackType = 'All' ) #=================================================================================================== # ABORT #=================================================================================================== if (Get-IsTemplatesEnabled) {Return} if ($SkipContentPacks -eq $true) {Return} if (($ScriptName -ne 'New-OSBuild') -and ($ScriptName -ne 'New-PEBuild')) {Return} #=================================================================================================== # BUILD #=================================================================================================== if ($ContentPacks) { #=================================================================================================== # MEDIA ContentPacks #=================================================================================================== if ($PackType -eq 'MEDIA') { Show-ActionTime; Write-Host -ForegroundColor Green "MEDIA: ContentPack" foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\MEDIA" Add-ContentPackMEDIA -ContentPackContent "$ContentPackPath\ALL" Add-ContentPackMEDIA -ContentPackContent "$ContentPackPath\$OSArchitecture" Add-ContentPackMEDIA -ContentPackContent "$ContentPackPath\$ReleaseID $OSArchitecture" } } #=================================================================================================== # WinPE ContentPacks #=================================================================================================== if ($PackType -eq 'PEADK') { Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: ContentPack PEADK" foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\PEADK" Add-ContentPackPEADK -ContentPackContent "$ContentPackPath\$ReleaseID $OSArchitecture" } } if ($PackType -eq 'PEADKLang') { Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: ContentPack PEADKLang" foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\PEADKLang" Add-ContentPackPEADK -ContentPackContent "$ContentPackPath\$ReleaseID $OSArchitecture" -Lang } } if ($PackType -eq 'PEDaRT') { Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: ContentPack PEDaRT" foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\PEDaRT" Add-ContentPackPEDaRT -ContentPackContent "$ContentPackPath" } } if ($PackType -eq 'PEDrivers') { Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: ContentPack PEDrivers" foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\PEDrivers" Add-ContentPackPEDrivers -ContentPackContent "$ContentPackPath\ALL" Add-ContentPackPEDrivers -ContentPackContent "$ContentPackPath\$OSArchitecture" } } if ($PackType -eq 'PEExtraFiles') { Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: ContentPack PEExtraFiles" foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\PEExtraFiles" Add-ContentPackPEExtraFiles -ContentPackContent "$ContentPackPath\ALL" Add-ContentPackPEExtraFiles -ContentPackContent "$ContentPackPath\$OSArchitecture" Get-ChildItem "$ContentPackPath\ALL Subdirs" -Directory -ErrorAction SilentlyContinue | foreach { Add-ContentPackPEExtraFiles -ContentPackContent "$($_.FullName)" } Get-ChildItem "$ContentPackPath\$OSArchitecture Subdirs" -Directory -ErrorAction SilentlyContinue | foreach { Add-ContentPackPEExtraFiles -ContentPackContent "$($_.FullName)" } } } if ($PackType -eq 'PEPoshMods') { Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: ContentPack PEPoshMods" foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\PEPoshMods" Add-ContentPackPEPoshMods -ContentPackContent "$ContentPackPath\ProgramFiles" } foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\PEPoshMods" Add-ContentPackPEPoshModsSystem -ContentPackContent "$ContentPackPath\System" } } if ($PackType -eq 'PERegistry') { Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: ContentPack PERegistry" foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\PERegistry" Add-ContentPackPERegistry -ContentPackContent "$ContentPackPath\ALL" Add-ContentPackPERegistry -ContentPackContent "$ContentPackPath\$OSArchitecture" Add-ContentPackPERegistry -ContentPackContent "$ContentPackPath\$ReleaseID $OSArchitecture" } } if ($PackType -eq 'PEScripts') { Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: ContentPack PEScripts" foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\PEScripts" Add-ContentPackPEScripts -ContentPackContent "$ContentPackPath\ALL" Add-ContentPackPEScripts -ContentPackContent "$ContentPackPath\$OSArchitecture" Add-ContentPackPEScripts -ContentPackContent "$ContentPackPath\$ReleaseID $OSArchitecture" } } #=================================================================================================== # OS ContentPacks #=================================================================================================== if ($PackType -eq 'OSDrivers') { Show-ActionTime; Write-Host -ForegroundColor Green "OS: ContentPack OSDrivers" foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSDrivers" Add-ContentPackOSDrivers -ContentPackContent "$ContentPackPath\ALL" Add-ContentPackOSDrivers -ContentPackContent "$ContentPackPath\$OSArchitecture" Add-ContentPackOSDrivers -ContentPackContent "$ContentPackPath\$ReleaseID $OSArchitecture" } } if ($PackType -eq 'OSExtraFiles') { Show-ActionTime; Write-Host -ForegroundColor Green "OS: ContentPack OSExtraFiles" foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSExtraFiles" Add-ContentPackOSExtraFiles -ContentPackContent "$ContentPackPath\ALL" Add-ContentPackOSExtraFiles -ContentPackContent "$ContentPackPath\$OSArchitecture" Get-ChildItem "$ContentPackPath\All Subdirs" -Directory -ErrorAction SilentlyContinue | foreach {Add-ContentPackOSExtraFiles -ContentPackContent "$($_.FullName)"} Get-ChildItem "$ContentPackPath\$OSArchitecture Subdirs" -Directory -ErrorAction SilentlyContinue | foreach {Add-ContentPackOSExtraFiles -ContentPackContent "$($_.FullName)"} } } if ($PackType -eq 'OSCapability') { Show-ActionTime; Write-Host -ForegroundColor Green "OS: ContentPack OSCapability" foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSCapability" Add-ContentPackOSCapability -ContentPackContent "$ContentPackPath\$ReleaseID $OSArchitecture" Add-ContentPackOSCapability -ContentPackContent "$ContentPackPath\$ReleaseID $OSArchitecture RSAT" -RSAT } } if ($PackType -eq 'OSLanguageFeatures') { Show-ActionTime; Write-Host -ForegroundColor Green "OS: ContentPack OSLanguageFeatures" foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSLanguageFeatures" Add-ContentPackOSLanguageFeatures -ContentPackContent "$ContentPackPath\$ReleaseID $OSArchitecture" } } if ($PackType -eq 'OSLanguagePacks') { Show-ActionTime; Write-Host -ForegroundColor Green "OS: ContentPack OSLanguagePacks" foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSLanguagePacks" Add-ContentPackOSLanguagePacks -ContentPackContent "$ContentPackPath\$ReleaseID $OSArchitecture" } } if ($PackType -eq 'OSLocalExperiencePacks') { Show-ActionTime; Write-Host -ForegroundColor Green "OS: ContentPack OSLocalExperiencePacks" foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSLocalExperiencePacks" Add-ContentPackOSLocalExperiencePacks -ContentPackContent "$ContentPackPath\$ReleaseID $OSArchitecture" } } if ($PackType -eq 'OSPackages') { Show-ActionTime; Write-Host -ForegroundColor Green "OS: ContentPack OSPackages" foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSPackages" Add-ContentPackOSPackages -ContentPackContent "$ContentPackPath\$ReleaseID $OSArchitecture" } } if ($PackType -eq 'OSPoshMods') { Show-ActionTime; Write-Host -ForegroundColor Green "OS: ContentPack OSPoshMods" foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSPoshMods" Add-ContentPackOSPoshMods -ContentPackContent "$ContentPackPath\ProgramFiles" } foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSPoshMods" Add-ContentPackOSPoshModsSystem -ContentPackContent "$ContentPackPath\System" } } if ($PackType -eq 'OSRegistry') { Show-ActionTime; Write-Host -ForegroundColor Green "OS: ContentPack OSRegistry" foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSRegistry" Add-ContentPackOSRegistry -ContentPackContent "$ContentPackPath\ALL" Add-ContentPackOSRegistry -ContentPackContent "$ContentPackPath\$OSArchitecture" Add-ContentPackOSRegistry -ContentPackContent "$ContentPackPath\$ReleaseID $OSArchitecture" } } if ($PackType -eq 'OSScripts') { Show-ActionTime; Write-Host -ForegroundColor Green "OS: ContentPack OSScripts" foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSScripts" Add-ContentPackOSScripts -ContentPackContent "$ContentPackPath\ALL" Add-ContentPackOSScripts -ContentPackContent "$ContentPackPath\$OSArchitecture" Add-ContentPackOSScripts -ContentPackContent "$ContentPackPath\$ReleaseID $OSArchitecture" } } if ($PackType -eq 'OSStartLayout') { Show-ActionTime; Write-Host -ForegroundColor Green "OS: ContentPack OSStartLayout" foreach ($ContentPack in $ContentPacks) { $ContentPackPath = Join-Path $SetOSDBuilderPathContentPacks "$ContentPack\OSStartLayout" Add-ContentPackOSStartLayouts -ContentPackContent "$ContentPackPath\ALL" Add-ContentPackOSStartLayouts -ContentPackContent "$ContentPackPath\$OSArchitecture" Add-ContentPackOSStartLayouts -ContentPackContent "$ContentPackPath\$ReleaseID $OSArchitecture" } } } } function Add-ContentPackMEDIA { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$ContentPackContent ) #====================================================================================== # Test #====================================================================================== if (!(Test-Path "$ContentPackContent\*")) { Write-Verbose "Add-ContentPackMEDIA: Unable to locate content in $ContentPackContent" Return } else { Write-Host "$ContentPackContent" -ForegroundColor Cyan } #====================================================================================== # Import #====================================================================================== $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentPackMEDIA.log" Write-Verbose "CurrentLog: $CurrentLog" Get-ChildItem "$ContentPackContent" *.* -File -Recurse | Select-Object -Property FullName | foreach {Write-Host "$($_.FullName)" -ForegroundColor DarkGray} robocopy "$ContentPackContent" "$OS" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null } function Add-ContentPackOSDrivers { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$ContentPackContent #[string]$MountDirectory ) #====================================================================================== # Test #====================================================================================== if (!(Test-Path "$ContentPackContent\*")) { Write-Verbose "Add-ContentPackOSDrivers: Unable to locate content in $ContentPackContent" Return } else { Write-Host "$ContentPackContent" -ForegroundColor Cyan } #====================================================================================== # Import #====================================================================================== $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentPackOSDrivers.log" Write-Verbose "CurrentLog: $CurrentLog" Get-ChildItem "$ContentPackContent" *.inf -File -Recurse | Select-Object -Property FullName | foreach {Write-Host "$($_.FullName)" -ForegroundColor DarkGray} if ($OSMajorVersion -eq 6) { dism /Image:"$MountDirectory" /Add-Driver /Driver:"$ContentPackContent" /Recurse /ForceUnsigned /LogPath:"$CurrentLog" } else { Add-WindowsDriver -Driver "$ContentPackContent" -Recurse -Path "$MountDirectory" -ForceUnsigned -LogPath "$CurrentLog" | Out-Null } } function Add-ContentPackOSExtraFiles { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$ContentPackContent ) #====================================================================================== # Test #====================================================================================== if (!(Test-Path "$ContentPackContent\*")) { Write-Verbose "Add-ContentPackOSExtraFiles: Unable to locate content in $ContentPackContent" Return } else { Write-Host "$ContentPackContent" -ForegroundColor Cyan } #====================================================================================== # Import #====================================================================================== $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentPackOSExtraFiles.log" Write-Verbose "CurrentLog: $CurrentLog" Get-ChildItem "$ContentPackContent" *.* -File -Recurse | Select-Object -Property FullName | foreach {Write-Host "$($_.FullName)" -ForegroundColor DarkGray} robocopy "$ContentPackContent" "$MountDirectory" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null } function Add-ContentPackOSCapability { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$ContentPackContent, [switch]$RSAT ) #====================================================================================== # Test #====================================================================================== if (!(Test-Path "$ContentPackContent\FoDMetadata_Client.cab")) { Write-Verbose "Add-ContentPackOSCapability: Unable to locate content in $ContentPackContent" Return } else { Write-Host "$ContentPackContent" -ForegroundColor Cyan } #====================================================================================== # Import #====================================================================================== if ($RSAT.IsPresent) { Get-WindowsCapability -Path $MountDirectory -LimitAccess | Where-Object {$_.Name -match 'RSAT'} | Where-Object {$_.State -eq 'NotPresent'} | foreach { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackOSCapability-$($_.Name).log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "$($_.Name)" -ForegroundColor DarkGray Try { Add-WindowsCapability -Path $MountDirectory -Name $_.Name -Source $ContentPackContent -LimitAccess -LogPath $CurrentLog | Out-Null } Catch { if ($_.Exception.Message -match '0x800f081e') { Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose } else { Write-Warning $_.Exception.ErrorCode Write-Warning $_.Exception.Message } } } } else { Get-WindowsCapability -Path $MountDirectory -LimitAccess | Where-Object {$_.Name -notmatch 'Language'} | Where-Object {$_.Name -notmatch 'RSAT'} | Where-Object {$_.State -eq 'NotPresent'} | foreach { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackOSCapability-$($_.Name).log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "$($_.Name)" -ForegroundColor DarkGray Try { Add-WindowsCapability -Path $MountDirectory -Name $_.Name -Source $ContentPackContent -LimitAccess -LogPath $CurrentLog | Out-Null } Catch { if ($_.Exception.Message -match '0x800f081e') { Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose } else { Write-Warning $_.Exception.ErrorCode Write-Warning $_.Exception.Message } } } } <# $OSFeaturesFiles = Get-ChildItem "$ContentPackContent\*" -Include *.cab -File -Recurse | Sort-Object Name | Select-Object Name, FullName, Directory Pause Get-WindowsCapability -Offline -Path $MountDirectory foreach ($item in $OSFeaturesFiles) { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackOSCapability-$($item.Name).log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "$($item.FullName)" -ForegroundColor DarkGray if ($MountDirectory) { Try {Add-WindowsCapability -Name $item.FullName -Path $MountDirectory -Source $item.Directory -LimitAccess -LogPath $CurrentLog | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } Try {Add-WindowsPackage -PackagePath "$($item.FullName)" -Path "$MountDirectory" -LogPath $CurrentLog | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } #> } function Add-ContentPackOSLanguageFeatures { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$ContentPackContent ) #====================================================================================== # Test #====================================================================================== if (!(Test-Path "$ContentPackContent\*")) { Write-Verbose "Add-ContentPackOSLanguageFeatures: Unable to locate content in $ContentPackContent" Return } else { Write-Host "$ContentPackContent" -ForegroundColor Cyan } #====================================================================================== # Import #====================================================================================== $OSLanguageFeaturesFiles = Get-ChildItem "$ContentPackContent\*" -Include *.cab -File -Recurse | Sort-Object Length -Descending | Select-Object Name, FullName foreach ($OSLanguageFeaturesFile in $OSLanguageFeaturesFiles) { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackOSLanguageFeatures-$($OSLanguageFeaturesFile.Name).log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "$($OSLanguageFeaturesFile.FullName)" -ForegroundColor DarkGray if ($MountDirectory) { Try {Add-WindowsPackage -PackagePath "$($OSLanguageFeaturesFile.FullName)" -Path "$MountDirectory" -LogPath $CurrentLog | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } } function Add-ContentPackOSLanguagePacks { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$ContentPackContent ) #====================================================================================== # Test #====================================================================================== if (!(Test-Path "$ContentPackContent\*")) { Write-Verbose "Add-ContentPackOSLanguagePacks: Unable to locate content in $ContentPackContent" Return } else { Write-Host "$ContentPackContent" -ForegroundColor Cyan } #====================================================================================== # Import #====================================================================================== $OSLanguagePacksFiles = Get-ChildItem "$ContentPackContent\*" -Include *.cab -File | Sort-Object Length -Descending | Select-Object Name, FullName foreach ($OSLanguagePacksFile in $OSLanguagePacksFiles) { $global:UpdateLanguageContent = $true $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackOSLanguagePacks-$($OSLanguagePacksFile.Name).log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "$($OSLanguagePacksFile.FullName)" -ForegroundColor DarkGray if ($MountDirectory) { Try {Add-WindowsPackage -PackagePath "$($OSLanguagePacksFile.FullName)" -Path "$MountDirectory" -LogPath $CurrentLog | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } } function Add-ContentPackOSLocalExperiencePacks { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$ContentPackContent ) #====================================================================================== # Test #====================================================================================== if (!(Test-Path "$ContentPackContent\*")) { Write-Verbose "Add-ContentPackOSLocalExperiencePacks: Unable to locate content in $ContentPackContent" Return } else { Write-Host "$ContentPackContent" -ForegroundColor Cyan } #====================================================================================== # Import #====================================================================================== $OSLocalExperiencePacksFiles = Get-ChildItem "$ContentPackContent" *.appx -File -Recurse | Sort-Object Length -Descending | Select-Object Name, FullName foreach ($OSLocalExperiencePacksFile in $OSLocalExperiencePacksFiles) { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackOSLocalExperiencePacks-$($OSLocalExperiencePacksFile.Name).log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "$($OSLocalExperiencePacksFile.FullName)" -ForegroundColor DarkGray if ($MountDirectory) { $LicensePath = "$((Get-Item $OSLocalExperiencePacksFile.FullName).Directory.FullName)\License.xml" if (!(Test-Path $LicensePath)) { Write-Warning "Unable to find Appx License at $LicensePath" } else { Try {Add-AppxProvisionedPackage -Path "$MountDirectory" -PackagePath $OSLocalExperiencePacksFile.FullName -LicensePath $LicensePath -LogPath $CurrentLog | Out-Null} Catch {$ErrorMessage = $_.Exception.$ErrorMessage; Write-Warning "$CurrentLog"; Write-Host "$ErrorMessage"} } } } } function Add-ContentPackOSPackages { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$ContentPackContent ) #====================================================================================== # Test #====================================================================================== if (!(Test-Path "$ContentPackContent\*")) { Write-Verbose "Add-ContentPackOSPackages: Unable to locate content in $ContentPackContent" Return } else { Write-Host "$ContentPackContent" -ForegroundColor Cyan } #====================================================================================== # Import #====================================================================================== $OSPackagesFiles = Get-ChildItem "$ContentPackContent\*" -Include *.cab -File -Recurse | Sort-Object Name | Select-Object Name, FullName foreach ($item in $OSPackagesFiles) { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackOSPackages-$($item.Name).log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "$($item.FullName)" -ForegroundColor DarkGray if ($MountDirectory) { Try {Add-WindowsPackage -PackagePath "$($item.FullName)" -Path "$MountDirectory" -LogPath $CurrentLog | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } } function Add-ContentPackOSPoshMods { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$ContentPackContent ) #====================================================================================== # Test #====================================================================================== if (!(Test-Path "$ContentPackContent\*")) { Write-Verbose "Add-ContentPackOSPoshMods: Unable to locate content in $ContentPackContent" Return } else { Write-Host "$ContentPackContent" -ForegroundColor Cyan } #====================================================================================== # Import #====================================================================================== $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentPackOSPoshMods.log" Write-Verbose "CurrentLog: $CurrentLog" Get-ChildItem "$ContentPackContent" *.* -File -Recurse | Select-Object -Property FullName | foreach {Write-Host "$($_.FullName)" -ForegroundColor DarkGray} robocopy "$ContentPackContent" "$MountDirectory\Program Files\WindowsPowerShell\Modules" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null } function Add-ContentPackOSPoshModsSystem { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$ContentPackContent ) #====================================================================================== # Test #====================================================================================== if (!(Test-Path "$ContentPackContent\*")) { Write-Verbose "Add-ContentPackOSPoshModsSystem: Unable to locate content in $ContentPackContent" Return } else { Write-Host "$ContentPackContent" -ForegroundColor Cyan } #====================================================================================== # Import #====================================================================================== $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentPackOSPoshModsSystem.log" Write-Verbose "CurrentLog: $CurrentLog" Get-ChildItem "$ContentPackContent" *.* -File -Recurse | Select-Object -Property FullName | foreach {Write-Host "$($_.FullName)" -ForegroundColor DarkGray} robocopy "$ContentPackContent" "$MountDirectory\Windows\System32\WindowsPowerShell\v1.0\Modules" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null } function Add-ContentPackOSRegistry { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$ContentPackContent, [switch]$ShowRegContent ) #====================================================================================== # Test-OSDContentPackOSRegistry #====================================================================================== if (!(Test-Path "$ContentPackContent\*")) { Write-Verbose "Add-ContentPackOSRegistry: Unable to locate content in $ContentPackContent" Return } else { Write-Host "$ContentPackContent" -ForegroundColor Cyan } #====================================================================================== # Mount-OfflineRegistryHives #====================================================================================== if (($MountDirectory) -and (Test-Path "$MountDirectory" -ErrorAction SilentlyContinue)) { if (Test-Path "$MountDirectory\Users\Default\NTUser.dat") { Write-Verbose "Loading Offline Registry Hive Default User" Start-Process reg -ArgumentList "load HKLM\OfflineDefaultUser $MountDirectory\Users\Default\NTUser.dat" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue } if (Test-Path "$MountDirectory\Windows\System32\Config\DEFAULT") { Write-Verbose "Loading Offline Registry Hive DEFAULT" Start-Process reg -ArgumentList "load HKLM\OfflineDefault $MountDirectory\Windows\System32\Config\DEFAULT" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue } if (Test-Path "$MountDirectory\Windows\System32\Config\SOFTWARE") { Write-Verbose "Loading Offline Registry Hive SOFTWARE" Start-Process reg -ArgumentList "load HKLM\OfflineSoftware $MountDirectory\Windows\System32\Config\SOFTWARE" -Wait -WindowStyle Hidden -ErrorAction Stop } if (Test-Path "$MountDirectory\Windows\System32\Config\SYSTEM") { Write-Verbose "Loading Offline Registry Hive SYSTEM" Start-Process reg -ArgumentList "load HKLM\OfflineSystem $MountDirectory\Windows\System32\Config\SYSTEM" -Wait -WindowStyle Hidden -ErrorAction Stop } $OSDContentPackTemp = "$env:TEMP\$(Get-Random)" if (!(Test-Path $OSDContentPackTemp)) {New-Item -Path "$OSDContentPackTemp" -ItemType Directory -Force | Out-Null} } #====================================================================================== # Get-RegFiles #====================================================================================== [array]$ContentPackContentFiles = @() [array]$ContentPackContentFiles = Get-ChildItem "$ContentPackContent" *.reg -Recurse | Select-Object -Property Name, BaseName, Extension, Directory, FullName #====================================================================================== # Add-ContentPackOSRegistryFiles #====================================================================================== foreach ($OSDRegistryRegFile in $ContentPackContentFiles) { $OSDRegistryImportFile = $OSDRegistryRegFile.FullName if ($MountDirectory) { $RegFileContent = Get-Content -Path $OSDRegistryImportFile $OSDRegistryImportFile = "$OSDContentPackTemp\$($OSDRegistryRegFile.BaseName).reg" $RegFileContent = $RegFileContent -replace 'HKEY_CURRENT_USER','HKEY_LOCAL_MACHINE\OfflineDefaultUser' $RegFileContent = $RegFileContent -replace 'HKEY_LOCAL_MACHINE\\SOFTWARE','HKEY_LOCAL_MACHINE\OfflineSoftware' $RegFileContent = $RegFileContent -replace 'HKEY_LOCAL_MACHINE\\SYSTEM','HKEY_LOCAL_MACHINE\OfflineSystem' $RegFileContent = $RegFileContent -replace 'HKEY_USERS\\.DEFAULT','HKEY_LOCAL_MACHINE\OfflineDefault' $RegFileContent | Set-Content -Path $OSDRegistryImportFile -Force } Write-Host "$OSDRegistryImportFile" -ForegroundColor DarkGray if ($ShowRegContent.IsPresent){ $OSDContentPackRegFileContent = @() $OSDContentPackRegFileContent = Get-Content -Path $OSDRegistryImportFile foreach ($Line in $OSDContentPackRegFileContent) { Write-Host "$Line" -ForegroundColor Gray } } Start-Process reg -ArgumentList ('import',"`"$OSDRegistryImportFile`"") -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue } #====================================================================================== # Remove-OSDContentPackTemp #====================================================================================== if ($MountDirectory) { if (Test-Path $OSDContentPackTemp) {Remove-Item -Path "$OSDContentPackTemp" -Recurse -Force | Out-Null} } #====================================================================================== # Dismount-RegistryHives #====================================================================================== Dismount-OSDOfflineRegistry -MountPath $MountDirectory } function Add-ContentPackOSScripts { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$ContentPackContent ) #====================================================================================== # TEST #====================================================================================== if (!(Test-Path "$ContentPackContent\*")) { Write-Verbose "Add-ContentPackOSScripts: Unable to locate content in $ContentPackContent" Return } else {Write-Host "$ContentPackContent" -ForegroundColor Cyan} #====================================================================================== # BUILD #====================================================================================== $ContentPackOSScripts = Get-ChildItem "$ContentPackContent" *.ps1 -File -Recurse | Select-Object -Property FullName foreach ($ContentPackOSScript in $ContentPackOSScripts) { Write-Host "$($ContentPackOSScript.FullName)" -ForegroundColor DarkGray Invoke-Expression "& '$($ContentPackOSScript.FullName)'" } } function Add-ContentPackOSStartLayouts { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$ContentPackContent ) #====================================================================================== # TEST #====================================================================================== if (!(Test-Path "$ContentPackContent\*")) { Write-Verbose "Add-ContentPackOSStartLayouts: Unable to locate content in $ContentPackContent" Return } else {Write-Host "$ContentPackContent" -ForegroundColor Cyan} #====================================================================================== # BUILD #====================================================================================== $ContentPackOSStartLayouts = Get-ChildItem "$ContentPackContent\*.xml" -File | Select-Object -Property FullName foreach ($ContentPackOSStartLayout in $ContentPackOSStartLayouts) { Write-Host "$($ContentPackOSStartLayout.FullName)" -ForegroundColor DarkGray Try { Copy-Item -Path "$($ContentPackOSStartLayout.FullName)" -Destination "$MountDirectory\Users\Default\AppData\Local\Microsoft\Windows\Shell\LayoutModification.xml" -Recurse -Force | Out-Null } Catch { $ErrorMessage = $_.Exception.Message Write-Warning "$ErrorMessage" } } } function Add-ContentPackPEADK { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$ContentPackContent, [string]$MountPath, [switch]$Lang #[ValidateSet('MDT','Recovery','WinPE')] #[string]$WinPEOutput, #[ValidateSet('WinPE','WinRE')] #[string]$SourceWim ) #====================================================================================== # Test #====================================================================================== if (!(Test-Path "$ContentPackContent\*")) { Write-Verbose "Add-ContentPackPEADK: Unable to locate content in $ContentPackContent" Return } else { Write-Host "$ContentPackContent" -ForegroundColor Cyan } if ($Lang.IsPresent) { $global:ReapplyLCU = $true $global:UpdateLanguageContent = $true } #====================================================================================== # Import #====================================================================================== $ADKFiles = Get-ChildItem "$ContentPackContent\*" -Include *.cab -File | Sort-Object Length -Descending | Select-Object Name, FullName $ADKFilesSub = Get-ChildItem "$ContentPackContent\*\*" -Include *.cab -File -Recurse | Sort-Object Length -Descending | Select-Object Name, FullName if ($ScriptName -eq 'New-PEBuild') { if ($WinPEOutput -eq 'MDT') {} if ($WinPEOutput -eq 'Recovery') {} if ($WinPEOutput -eq 'WinPE') {} if ($SourceWim -eq 'WinPE') { $ADKFiles = $ADKFiles | Where-Object {$_.Name -notmatch 'setup'} | Where-Object {$_.Name -notmatch 'wifi'} | Where-Object {$_.Name -notmatch 'appxpackaging'} | Where-Object {$_.Name -notmatch 'rejuv'} | Where-Object {$_.Name -notmatch 'opcservices'} $ADKFilesSub = $ADKFilesSub | Where-Object {$_.Name -notmatch 'setup'} | Where-Object {$_.Name -notmatch 'wifi'} | Where-Object {$_.Name -notmatch 'appxpackaging'} | Where-Object {$_.Name -notmatch 'rejuv'} | Where-Object {$_.Name -notmatch 'opcservices'} } if ($SourceWim -eq 'WinRE') { $ADKFiles = $ADKFiles | Where-Object {$_.Name -notmatch 'setup'} $ADKFilesSub = $ADKFiles | Where-Object {$_.Name -notmatch 'setup'} } foreach ($ADKFile in $ADKFiles | Where-Object {$_.Name -eq 'lp.cab'}) { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "$($ADKFile.FullName)" -ForegroundColor DarkGray if ($MountDirectory) { Try {Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountDirectory" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } foreach ($ADKFile in $ADKFiles | Where-Object {$_.Name -ne 'lp.cab'}) { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "$($ADKFile.FullName)" -ForegroundColor DarkGray if ($MountDirectory) { Try {Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountDirectory" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } foreach ($ADKFile in $ADKFilesSub | Where-Object {$_.Name -eq 'lp.cab'}) { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "$($ADKFile.FullName)" -ForegroundColor DarkGray if ($MountDirectory) { Try {Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountDirectory" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } foreach ($ADKFile in $ADKFilesSub | Where-Object {$_.Name -ne 'lp.cab'}) { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "$($ADKFile.FullName)" -ForegroundColor DarkGray if ($MountDirectory) { Try {Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountDirectory" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } Return } foreach ($ADKFile in $ADKFiles | Where-Object {$_.Name -notmatch 'Setup'}) { if ($MountWinPE) { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "WinPE: $($ADKFile.FullName)" -ForegroundColor DarkGray Try {Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountWinPE" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } if ($MountWinRE) { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "WinRE: $($ADKFile.FullName)" -ForegroundColor DarkGray Try {Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountWinRE" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } if ($MountWinSE) { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "WinSE: $($ADKFile.FullName)" -ForegroundColor DarkGray Try {Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountWinSE" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } $ADKFilesWinPE = $ADKFilesSub | Where-Object {$_.Name -notmatch 'setup'} | Where-Object {$_.Name -notmatch 'wifi'} | Where-Object {$_.Name -notmatch 'appxpackaging'} | Where-Object {$_.Name -notmatch 'rejuv'} | Where-Object {$_.Name -notmatch 'opcservices'} $ADKFilesWinRE = $ADKFilesSub | Where-Object {$_.Name -notmatch 'setup'} $ADKFilesWinSE = $ADKFilesSub | Where-Object {$_.Name -notmatch 'wifi'} | Where-Object {$_.Name -notmatch 'legacysetup'} | Where-Object {$_.Name -notmatch 'appxpackaging'} | Where-Object {$_.Name -notmatch 'rejuv'} | Where-Object {$_.Name -notmatch 'opcservices'} foreach ($ADKFile in $ADKFilesWinPE | Where-Object {$_.Name -eq 'lp.cab'}) { if ($MountWinPE) { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "WinPE: $($ADKFile.FullName)" -ForegroundColor DarkGray Try {Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountWinPE" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } foreach ($ADKFile in $ADKFilesWinRE | Where-Object {$_.Name -eq 'lp.cab'}) { if ($MountWinRE) { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "WinRE: $($ADKFile.FullName)" -ForegroundColor DarkGray Try {Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountWinRE" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } foreach ($ADKFile in $ADKFilesWinSE | Where-Object {$_.Name -eq 'lp.cab'}) { if ($MountWinSE) { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "WinSE: $($ADKFile.FullName)" -ForegroundColor DarkGray Try {Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountWinSE" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } foreach ($ADKFile in $ADKFilesWinPE | Where-Object {$_.Name -ne 'lp.cab'}) { if ($MountWinPE) { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "WinPE: $($ADKFile.FullName)" -ForegroundColor DarkGray Try {Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountWinPE" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } foreach ($ADKFile in $ADKFilesWinRE | Where-Object {$_.Name -ne 'lp.cab'}) { if ($MountWinRE) { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "WinRE: $($ADKFile.FullName)" -ForegroundColor DarkGray Try {Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountWinRE" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } foreach ($ADKFile in $ADKFilesWinSE | Where-Object {$_.Name -ne 'lp.cab'}) { if ($MountWinSE) { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-ContentPackPEADK-$($ADKFile.Name).log" Write-Verbose "CurrentLog: $CurrentLog" Write-Host "WinSE: $($ADKFile.FullName)" -ForegroundColor DarkGray Try {Add-WindowsPackage -PackagePath "$($ADKFile.FullName)" -Path "$MountWinSE" -LogPath "$CurrentLog" | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } } function Add-ContentPackPEDaRT { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$ContentPackContent ) #====================================================================================== # TEST #====================================================================================== if (!(Test-Path "$ContentPackContent\Tools$($OSArchitecture).cab")) { Write-Verbose "Add-ContentPackPEDaRT: Unable to locate content in $ContentPackContent" Return } else {Write-Host "$ContentPackContent\Tools$($OSArchitecture).cab" -ForegroundColor Cyan} #====================================================================================== # BUILD #====================================================================================== $MicrosoftDartCab = "$ContentPackContent\Tools$($OSArchitecture).cab" if (Test-Path $MicrosoftDartCab) { if ($MountWinPE) {expand.exe "$MicrosoftDartCab" -F:*.* "$MountWinPE" | Out-Null} if ($MountWinRE) {expand.exe "$MicrosoftDartCab" -F:*.* "$MountWinRE" | Out-Null} if ($MountWinSE) {expand.exe "$MicrosoftDartCab" -F:*.* "$MountWinSE" | Out-Null} $MicrosoftDartConfig = $(Join-Path $(Split-Path "$MicrosoftDartCab") 'DartConfig.dat') if (Test-Path $MicrosoftDartConfig) { if ($MountWinPE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinPE\Windows\System32\DartConfig.dat" -Force} if ($MountWinRE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinSE\Windows\System32\DartConfig.dat" -Force} if ($MountWinSE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinRE\Windows\System32\DartConfig.dat" -Force} } $MicrosoftDartConfig = $(Join-Path $(Split-Path "$MicrosoftDartCab") 'DartConfig8.dat') if (Test-Path $MicrosoftDartConfig) { if ($MountWinPE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinPE\Windows\System32\DartConfig.dat" -Force} if ($MountWinRE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinSE\Windows\System32\DartConfig.dat" -Force} if ($MountWinSE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinRE\Windows\System32\DartConfig.dat" -Force} } if ($ScriptName -eq 'New-OSBuild') { if (Test-Path "$MountWinPE\Windows\System32\winpeshl.ini") {Remove-Item -Path "$MountWinPE\Windows\System32\winpeshl.ini" -Force} (Get-Content "$MountWinRE\Windows\System32\winpeshl.ini") | ForEach-Object {$_ -replace '-prompt','-network'} | Out-File "$MountWinRE\Windows\System32\winpeshl.ini" if (Test-Path "$MountWinSE\Windows\System32\winpeshl.ini") {Remove-Item -Path "$MountWinSE\Windows\System32\winpeshl.ini" -Force} } if ($ScriptName -eq 'New-PEBuild') { if ($WinPEOutput -eq 'Recovery') { (Get-Content "$MountDirectory\Windows\System32\winpeshl.ini") | ForEach-Object {$_ -replace '-prompt','-network'} | Out-File "$MountDirectory\Windows\System32\winpeshl.ini" } } } else {Write-Warning "Microsoft DaRT do not exist in $MicrosoftDartCab"} } function Add-ContentPackPEDrivers { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$ContentPackContent ) #====================================================================================== # Test #====================================================================================== if (!(Test-Path "$ContentPackContent\*")) { Write-Verbose "Add-ContentPackPEDrivers: Unable to locate content in $ContentPackContent" Return } else { Write-Host "$ContentPackContent" -ForegroundColor Cyan } #====================================================================================== # Import #====================================================================================== $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentPackPEDrivers.log" Write-Verbose "CurrentLog: $CurrentLog" Get-ChildItem "$ContentPackContent" *.inf -File -Recurse | Select-Object -Property FullName | foreach {Write-Host "$($_.FullName)" -ForegroundColor DarkGray} if ($OSMajorVersion -eq 6) { if ($MountWinPE) {dism /Image:"$MountWinPE" /Add-Driver /Driver:"$ContentPackContent" /Recurse /ForceUnsigned /LogPath:"$CurrentLog" | Out-Null} if ($MountWinRE) {dism /Image:"$MountWinRE" /Add-Driver /Driver:"$ContentPackContent" /Recurse /ForceUnsigned /LogPath:"$CurrentLog" | Out-Null} if ($MountWinSE) {dism /Image:"$MountWinSE" /Add-Driver /Driver:"$ContentPackContent" /Recurse /ForceUnsigned /LogPath:"$CurrentLog" | Out-Null} } else { if ($MountWinPE) {Add-WindowsDriver -Driver "$ContentPackContent" -Recurse -Path "$MountWinPE" -ForceUnsigned -LogPath "$CurrentLog" | Out-Null} if ($MountWinRE) {Add-WindowsDriver -Driver "$ContentPackContent" -Recurse -Path "$MountWinRE" -ForceUnsigned -LogPath "$CurrentLog" | Out-Null} if ($MountWinSE) {Add-WindowsDriver -Driver "$ContentPackContent" -Recurse -Path "$MountWinSE" -ForceUnsigned -LogPath "$CurrentLog" | Out-Null} } } function Add-ContentPackPEExtraFiles { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$ContentPackContent ) #====================================================================================== # Test #====================================================================================== if (!(Test-Path "$ContentPackContent\*")) { Write-Verbose "Add-ContentPackPEExtraFiles: Unable to locate content in $ContentPackContent" Return } else { Write-Host "$ContentPackContent" -ForegroundColor Cyan } #====================================================================================== # Import #====================================================================================== $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentPackPEExtraFiles.log" Write-Verbose "CurrentLog: $CurrentLog" Get-ChildItem "$ContentPackContent" *.* -File -Recurse | Select-Object -Property FullName | foreach {Write-Host "$($_.FullName)" -ForegroundColor DarkGray} if ($MountWinPE) {robocopy "$ContentPackContent" "$MountWinPE" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null} if ($MountWinRE) {robocopy "$ContentPackContent" "$MountWinRE" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null} if ($MountWinSE) {robocopy "$ContentPackContent" "$MountWinSE" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null} } function Add-ContentPackPEPoshMods { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$ContentPackContent ) #====================================================================================== # Test #====================================================================================== if (!(Test-Path "$ContentPackContent\*")) { Write-Verbose "Add-ContentPackPEPoshMods: Unable to locate content in $ContentPackContent" Return } else { Write-Host "$ContentPackContent" -ForegroundColor Cyan } #====================================================================================== # Import #====================================================================================== $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentPackPEPoshMods.log" Write-Verbose "CurrentLog: $CurrentLog" Get-ChildItem "$ContentPackContent" *.* -File -Recurse | Select-Object -Property FullName | foreach {Write-Host "$($_.FullName)" -ForegroundColor DarkGray} if ($MountWinPE) {robocopy "$ContentPackContent" "$MountWinPE\Program Files\WindowsPowerShell\Modules" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null} if ($MountWinRE) {robocopy "$ContentPackContent" "$MountWinRE\Program Files\WindowsPowerShell\Modules" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null} if ($MountWinSE) {robocopy "$ContentPackContent" "$MountWinSE\Program Files\WindowsPowerShell\Modules" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null} } function Add-ContentPackPEPoshModsSystem { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$ContentPackContent ) #====================================================================================== # Test #====================================================================================== if (!(Test-Path "$ContentPackContent\*")) { Write-Verbose "Add-ContentPackPEPoshModsSystem: Unable to locate content in $ContentPackContent" Return } else { Write-Host "$ContentPackContent" -ForegroundColor Cyan } #====================================================================================== # Import #====================================================================================== $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentPackPEPoshModsSystem.log" Write-Verbose "CurrentLog: $CurrentLog" Get-ChildItem "$ContentPackContent" *.* -File -Recurse | Select-Object -Property FullName | foreach {Write-Host "$($_.FullName)" -ForegroundColor DarkGray} if ($MountWinPE) {robocopy "$ContentPackContent" "$MountWinPE\Windows\System32\WindowsPowerShell\v1.0\Modules" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null} if ($MountWinRE) {robocopy "$ContentPackContent" "$MountWinRE\Windows\System32\WindowsPowerShell\v1.0\Modules" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null} if ($MountWinSE) {robocopy "$ContentPackContent" "$MountWinSE\Windows\System32\WindowsPowerShell\v1.0\Modules" *.* /e /ndl /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$CurrentLog" | Out-Null} } function Add-ContentPackPERegistry { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$ContentPackContent, [switch]$ShowRegContent ) #====================================================================================== # Test-OSDContentPackPERegistry #====================================================================================== if (!(Test-Path "$ContentPackContent\*")) { Write-Verbose "Add-ContentPackPERegistry: Unable to locate content in $ContentPackContent" Return } else { Write-Host "$ContentPackContent" -ForegroundColor Cyan } #====================================================================================== # Mount-OfflineRegistryHives #====================================================================================== if (($MountWinPE) -and (Test-Path "$MountWinPE" -ErrorAction SilentlyContinue)) { Mount-OSDOfflineRegistryPE -MountPath $MountWinPE } else {Return} $OSDContentPackTemp = "$env:TEMP\$(Get-Random)" if (!(Test-Path $OSDContentPackTemp)) {New-Item -Path "$OSDContentPackTemp" -ItemType Directory -Force | Out-Null} #====================================================================================== # Get-RegFiles #====================================================================================== [array]$ContentPackContentFiles = @() [array]$ContentPackContentFiles = Get-ChildItem "$ContentPackContent" *.reg -Recurse | Select-Object -Property Name, BaseName, Extension, Directory, FullName #====================================================================================== # Add-ContentPackPERegistryFiles #====================================================================================== foreach ($OSDRegistryRegFile in $ContentPackContentFiles) { $OSDRegistryImportFile = $OSDRegistryRegFile.FullName if ($MountWinPE) { $RegFileContent = Get-Content -Path $OSDRegistryImportFile $OSDRegistryImportFile = "$OSDContentPackTemp\$($OSDRegistryRegFile.BaseName).reg" $RegFileContent = $RegFileContent -replace 'HKEY_CURRENT_USER','HKEY_LOCAL_MACHINE\OfflineDefaultUser' $RegFileContent = $RegFileContent -replace 'HKEY_LOCAL_MACHINE\\SOFTWARE','HKEY_LOCAL_MACHINE\OfflineSoftware' $RegFileContent = $RegFileContent -replace 'HKEY_LOCAL_MACHINE\\SYSTEM','HKEY_LOCAL_MACHINE\OfflineSystem' $RegFileContent = $RegFileContent -replace 'HKEY_USERS\\.DEFAULT','HKEY_LOCAL_MACHINE\OfflineDefault' $RegFileContent | Set-Content -Path $OSDRegistryImportFile -Force } Write-Host "$OSDRegistryImportFile" -ForegroundColor DarkGray if ($ShowRegContent.IsPresent){ $OSDContentPackRegFileContent = @() $OSDContentPackRegFileContent = Get-Content -Path $OSDRegistryImportFile foreach ($Line in $OSDContentPackRegFileContent) { Write-Host "$Line" -ForegroundColor Gray } } Start-Process reg -ArgumentList ('import',"`"$OSDRegistryImportFile`"") -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue } #====================================================================================== # Remove-OSDContentPackTemp #====================================================================================== if ($MountWinPE) { if (Test-Path $OSDContentPackTemp) {Remove-Item -Path "$OSDContentPackTemp" -Recurse -Force | Out-Null} } #====================================================================================== # Dismount-RegistryHives #====================================================================================== Dismount-OSDOfflineRegistry -MountPath $MountWinPE #====================================================================================== # Mount-OfflineRegistryHives #====================================================================================== if (($MountWinRE) -and (Test-Path "$MountWinRE" -ErrorAction SilentlyContinue)) { Mount-OSDOfflineRegistryPE -MountPath $MountWinRE } else {Return} $OSDContentPackTemp = "$env:TEMP\$(Get-Random)" if (!(Test-Path $OSDContentPackTemp)) {New-Item -Path "$OSDContentPackTemp" -ItemType Directory -Force | Out-Null} #====================================================================================== # Get-RegFiles #====================================================================================== [array]$ContentPackContentFiles = @() [array]$ContentPackContentFiles = Get-ChildItem "$ContentPackContent" *.reg -Recurse | Select-Object -Property Name, BaseName, Extension, Directory, FullName #====================================================================================== # Add-ContentPackPERegistryFiles #====================================================================================== foreach ($OSDRegistryRegFile in $ContentPackContentFiles) { $OSDRegistryImportFile = $OSDRegistryRegFile.FullName if ($MountWinRE) { $RegFileContent = Get-Content -Path $OSDRegistryImportFile $OSDRegistryImportFile = "$OSDContentPackTemp\$($OSDRegistryRegFile.BaseName).reg" $RegFileContent = $RegFileContent -replace 'HKEY_CURRENT_USER','HKEY_LOCAL_MACHINE\OfflineDefaultUser' $RegFileContent = $RegFileContent -replace 'HKEY_LOCAL_MACHINE\\SOFTWARE','HKEY_LOCAL_MACHINE\OfflineSoftware' $RegFileContent = $RegFileContent -replace 'HKEY_LOCAL_MACHINE\\SYSTEM','HKEY_LOCAL_MACHINE\OfflineSystem' $RegFileContent = $RegFileContent -replace 'HKEY_USERS\\.DEFAULT','HKEY_LOCAL_MACHINE\OfflineDefault' $RegFileContent | Set-Content -Path $OSDRegistryImportFile -Force } Write-Host "$OSDRegistryImportFile" -ForegroundColor DarkGray if ($ShowRegContent.IsPresent){ $OSDContentPackRegFileContent = @() $OSDContentPackRegFileContent = Get-Content -Path $OSDRegistryImportFile foreach ($Line in $OSDContentPackRegFileContent) { Write-Host "$Line" -ForegroundColor Gray } } Start-Process reg -ArgumentList ('import',"`"$OSDRegistryImportFile`"") -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue } #====================================================================================== # Remove-OSDContentPackTemp #====================================================================================== if ($MountWinRE) { if (Test-Path $OSDContentPackTemp) {Remove-Item -Path "$OSDContentPackTemp" -Recurse -Force | Out-Null} } #====================================================================================== # Dismount-RegistryHives #====================================================================================== Dismount-OSDOfflineRegistry -MountPath $MountWinRE #====================================================================================== # Mount-OfflineRegistryHives #====================================================================================== if (($MountWinSE) -and (Test-Path "$MountWinSE" -ErrorAction SilentlyContinue)) { Mount-OSDOfflineRegistryPE -MountPath $MountWinSE } else {Return} $OSDContentPackTemp = "$env:TEMP\$(Get-Random)" if (!(Test-Path $OSDContentPackTemp)) {New-Item -Path "$OSDContentPackTemp" -ItemType Directory -Force | Out-Null} #====================================================================================== # Get-RegFiles #====================================================================================== [array]$ContentPackContentFiles = @() [array]$ContentPackContentFiles = Get-ChildItem "$ContentPackContent" *.reg -Recurse | Select-Object -Property Name, BaseName, Extension, Directory, FullName #====================================================================================== # Add-ContentPackPERegistryFiles #====================================================================================== foreach ($OSDRegistryRegFile in $ContentPackContentFiles) { $OSDRegistryImportFile = $OSDRegistryRegFile.FullName if ($MountWinSE) { $RegFileContent = Get-Content -Path $OSDRegistryImportFile $OSDRegistryImportFile = "$OSDContentPackTemp\$($OSDRegistryRegFile.BaseName).reg" $RegFileContent = $RegFileContent -replace 'HKEY_CURRENT_USER','HKEY_LOCAL_MACHINE\OfflineDefaultUser' $RegFileContent = $RegFileContent -replace 'HKEY_LOCAL_MACHINE\\SOFTWARE','HKEY_LOCAL_MACHINE\OfflineSoftware' $RegFileContent = $RegFileContent -replace 'HKEY_LOCAL_MACHINE\\SYSTEM','HKEY_LOCAL_MACHINE\OfflineSystem' $RegFileContent = $RegFileContent -replace 'HKEY_USERS\\.DEFAULT','HKEY_LOCAL_MACHINE\OfflineDefault' $RegFileContent | Set-Content -Path $OSDRegistryImportFile -Force } Write-Host "$OSDRegistryImportFile" -ForegroundColor DarkGray if ($ShowRegContent.IsPresent){ $OSDContentPackRegFileContent = @() $OSDContentPackRegFileContent = Get-Content -Path $OSDRegistryImportFile foreach ($Line in $OSDContentPackRegFileContent) { Write-Host "$Line" -ForegroundColor Gray } } Start-Process reg -ArgumentList ('import',"`"$OSDRegistryImportFile`"") -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue } #====================================================================================== # Remove-OSDContentPackTemp #====================================================================================== if ($MountWinSE) { if (Test-Path $OSDContentPackTemp) {Remove-Item -Path "$OSDContentPackTemp" -Recurse -Force | Out-Null} } #====================================================================================== # Dismount-RegistryHives #====================================================================================== Dismount-OSDOfflineRegistry -MountPath $MountWinSE } function Add-ContentPackPEScripts { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$ContentPackContent ) #====================================================================================== # TEST #====================================================================================== if (!(Test-Path "$ContentPackContent\*")) { Write-Verbose "Add-ContentPackPEScripts: Unable to locate content in $ContentPackContent" Return } else {Write-Host "$ContentPackContent" -ForegroundColor Cyan} #====================================================================================== # BUILD #====================================================================================== $ContentPackPEScripts = Get-ChildItem "$ContentPackContent" *.ps1 -File -Recurse | Select-Object -Property FullName foreach ($ContentPackPEScript in $ContentPackPEScripts) { Write-Host "$($ContentPackPEScript.FullName)" -ForegroundColor DarkGray Invoke-Expression "& '$($ContentPackPEScript.FullName)'" } } function Add-ContentScriptsOS { [CmdletBinding()] Param () #=================================================================================================== # ABORT #=================================================================================================== if ($ScriptName -ne 'New-OSBuild') {Return} #=================================================================================================== # TASK #=================================================================================================== if ($Scripts) { Show-ActionTime; Write-Host -ForegroundColor Green "OS: Scripts TASK" foreach ($Script in $Scripts) { if (Test-Path "$SetOSDBuilderPathContent\$Script") { Write-Host -ForegroundColor Cyan "Source: $SetOSDBuilderPathContent\$Script" Invoke-Expression "& '$SetOSDBuilderPathContent\$Script'" } } } #=================================================================================================== # TEMPLATE #=================================================================================================== if ($ScriptTemplates) { Show-ActionTime; Write-Host -ForegroundColor Green "OS: Scripts TEMPLATE" foreach ($Script in $ScriptTemplates) { if (Test-Path "$($Script.FullName)") { Write-Host -ForegroundColor Cyan "Source: $($Script.FullName)" Invoke-Expression "& '$($Script.FullName)'" } } } } function Add-ContentScriptsPE { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if ($ScriptName -ne 'New-OSBuild') {Return} #=================================================================================================== # TASK #=================================================================================================== if ($WinPEScriptsPE -or $WinPEScriptsRE -or $WinPEScriptsSE) { Show-ActionTime; Write-Host -ForegroundColor Green "WinPE: Scripts TASK" foreach ($PSWimScript in $WinPEScriptsPE) { if (Test-Path "$SetOSDBuilderPathContent\$PSWimScript") { Write-Host "Source: $SetOSDBuilderPathContent\$PSWimScript" -ForegroundColor Cyan (Get-Content "$SetOSDBuilderPathContent\$PSWimScript").replace('winpe.wim.log', 'WinPE.log') | Set-Content "$SetOSDBuilderPathContent\$PSWimScript" Invoke-Expression "& '$SetOSDBuilderPathContent\$PSWimScript'" } } foreach ($PSWimScript in $WinPEScriptsRE) { if (Test-Path "$SetOSDBuilderPathContent\$PSWimScript") { Write-Host "Source: $SetOSDBuilderPathContent\$PSWimScript" -ForegroundColor Cyan (Get-Content "$SetOSDBuilderPathContent\$PSWimScript").replace('winre.wim.log', 'WinRE.log') | Set-Content "$SetOSDBuilderPathContent\$PSWimScript" Invoke-Expression "& '$SetOSDBuilderPathContent\$PSWimScript'" } } foreach ($PSWimScript in $WinPEScriptsSE) { if (Test-Path "$SetOSDBuilderPathContent\$PSWimScript") { Write-Host "Source: $SetOSDBuilderPathContent\$PSWimScript" -ForegroundColor Cyan (Get-Content "$SetOSDBuilderPathContent\$PSWimScript").replace('MountSetup', 'MountWinSE') | Set-Content "$SetOSDBuilderPathContent\$PSWimScript" (Get-Content "$SetOSDBuilderPathContent\$PSWimScript").replace('setup.wim.log', 'WinSE.log') | Set-Content "$SetOSDBuilderPathContent\$PSWimScript" Invoke-Expression "& '$SetOSDBuilderPathContent\$PSWimScript'" } } } } function Add-ContentStartLayout { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if ($ScriptName -ne 'New-OSBuild') {Return} if ($OSMajorVersion -ne 10) {Return} if ([string]::IsNullOrWhiteSpace($StartLayoutXML)) {Return} #=================================================================================================== # TASK #=================================================================================================== Show-ActionTime; Write-Host -ForegroundColor Green "OS: Use Content StartLayout" Write-Host "$SetOSDBuilderPathContent\$StartLayoutXML" -ForegroundColor DarkGray Try { Copy-Item -Path "$SetOSDBuilderPathContent\$StartLayoutXML" -Destination "$MountDirectory\Users\Default\AppData\Local\Microsoft\Windows\Shell\LayoutModification.xml" -Recurse -Force | Out-Null } Catch { $ErrorMessage = $_.Exception.Message Write-Warning "$ErrorMessage" } } function Add-ContentUnattend { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if ($ScriptName -ne 'New-OSBuild') {Return} if ($OSMajorVersion -ne 10) {Return} if ([string]::IsNullOrWhiteSpace($UnattendXML)) {Return} #=================================================================================================== # Header #=================================================================================================== Show-ActionTime; Write-Host -ForegroundColor Green "OS: Use Content Unattend" #=================================================================================================== # Execute #=================================================================================================== Write-Host "$SetOSDBuilderPathContent\$UnattendXML" -ForegroundColor DarkGray if (!(Test-Path "$MountDirectory\Windows\Panther")) {New-Item -Path "$MountDirectory\Windows\Panther" -ItemType Directory -Force | Out-Null} Copy-Item -Path "$SetOSDBuilderPathContent\$UnattendXML" -Destination "$MountDirectory\Windows\Panther\Unattend.xml" -Force $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-ContentUnattend.log" Write-Verbose "CurrentLog: $CurrentLog" Try {Use-WindowsUnattend -UnattendPath "$SetOSDBuilderPathContent\$UnattendXML" -Path "$MountDirectory" -LogPath "$CurrentLog" | Out-Null} Catch { $ErrorMessage = $_.Exception.Message Write-Warning "$ErrorMessage" } } function Add-FeaturesOnDemandOS { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if ($ScriptName -ne 'New-OSBuild') {Return} if ([string]::IsNullOrWhiteSpace($FeaturesOnDemand)) {Return} #=================================================================================================== # Execute #=================================================================================================== Show-ActionTime; Write-Host -ForegroundColor Green "OS: Features On Demand" foreach ($FOD in $FeaturesOnDemand) { Write-Host "$SetOSDBuilderPathContent\$FOD" -ForegroundColor DarkGray $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-FeaturesOnDemandOS.log" Write-Verbose "CurrentLog: $CurrentLog" Try { Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$SetOSDBuilderPathContent\$FOD" -LogPath "$CurrentLog" | Out-Null } Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "OSDBuilder: Review the log for more information" -Verbose Write-Verbose "$CurrentLog" -Verbose } } #=================================================================================================== # PostAction #=================================================================================================== Update-CumulativeOS -Force Invoke-DismCleanupImage } function Add-LanguageFeaturesOnDemandOS { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if ($ScriptName -ne 'New-OSBuild') {Return} if ($OSMajorVersion -ne 10) {Return} if ([string]::IsNullOrWhiteSpace($LanguageFeatures)) {Return} #=================================================================================================== # Execute #=================================================================================================== Show-ActionTime; Write-Host -ForegroundColor Green "OS: Language Features On Demand" foreach ($Update in $LanguageFeatures | Where-Object {$_ -notlike "*Speech*"}) { if (Test-Path "$SetOSDBuilderPathContent\$Update") { Write-Host "$SetOSDBuilderPathContent\$Update" -ForegroundColor DarkGray $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-LanguageFeaturesOnDemandOS.log" Try {Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$SetOSDBuilderPathContent\$Update" -LogPath $CurrentLog | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } foreach ($Update in $LanguageFeatures | Where-Object {$_ -like "*TextToSpeech*"}) { if (Test-Path "$SetOSDBuilderPathContent\$Update") { Write-Host "$SetOSDBuilderPathContent\$Update" -ForegroundColor DarkGray $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-LanguageFeaturesOnDemandOS.log" Try {Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$SetOSDBuilderPathContent\$Update" -LogPath $CurrentLog | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } foreach ($Update in $LanguageFeatures | Where-Object {$_ -like "*Speech*" -and $_ -notlike "*TextToSpeech*"}) { if (Test-Path "$SetOSDBuilderPathContent\$Update") { Write-Host "$SetOSDBuilderPathContent\$Update" -ForegroundColor DarkGray $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-LanguageFeaturesOnDemandOS.log" Try {Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$SetOSDBuilderPathContent\$Update" -LogPath $CurrentLog | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } } } function Add-LanguageInterfacePacksOS { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if ($ScriptName -ne 'New-OSBuild') {Return} if ($OSMajorVersion -ne 10) {Return} if ([string]::IsNullOrWhiteSpace($LanguageInterfacePacks)) {Return} #=================================================================================================== # Header #=================================================================================================== Show-ActionTime; Write-Host -ForegroundColor Green "OS: Language Interface Packs" #=================================================================================================== # Execute #=================================================================================================== foreach ($Update in $LanguageInterfacePacks) { if (Test-Path "$SetOSDBuilderPathContent\$Update") { Write-Host "$SetOSDBuilderPathContent\$Update" -ForegroundColor DarkGray $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-LanguageInterfacePacksOS.log" Try {Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$SetOSDBuilderPathContent\$Update" -LogPath $CurrentLog | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } else { Write-Warning "Not Found: $SetOSDBuilderPathContent\$Update" } } } function Add-LanguagePacksOS { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if ($ScriptName -ne 'New-OSBuild') {Return} if ($OSMajorVersion -ne 10) {Return} if ([string]::IsNullOrWhiteSpace($LanguagePacks)) {Return} #=================================================================================================== # Header #=================================================================================================== Show-ActionTime; Write-Host -ForegroundColor Green "OS: Language Packs" #=================================================================================================== # Execute #=================================================================================================== foreach ($Update in $LanguagePacks) { if (Test-Path "$SetOSDBuilderPathContent\$Update") { if ($Update -like "*.cab") { Write-Host "$SetOSDBuilderPathContent\$Update" -ForegroundColor DarkGray $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-LanguagePacksOS.log" Try {Add-WindowsPackage -Path "$MountDirectory" -PackagePath "$SetOSDBuilderPathContent\$Update" -LogPath $CurrentLog | Out-Null} Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "$CurrentLog" -Verbose } } elseif ($Update -like "*.appx") { Write-Host "$SetOSDBuilderPathContent\$Update" -ForegroundColor DarkGray Add-AppxProvisionedPackage -Path "$MountDirectory" -PackagePath "$SetOSDBuilderPathContent\$Update" -LicensePath "$((Get-Item $SetOSDBuilderPathContent\$Update).Directory.FullName)\License.xml" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-LanguagePacksOS.log" | Out-Null } } else { Write-Warning "Not Found: $SetOSDBuilderPathContent\$Update" } } } function Add-LocalExperiencePacksOS { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if ($ScriptName -ne 'New-OSBuild') {Return} if ($OSMajorVersion -ne 10) {Return} if ([string]::IsNullOrWhiteSpace($LocalExperiencePacks)) {Return} #=================================================================================================== # Header #=================================================================================================== Show-ActionTime Write-Host -ForegroundColor Green "OS: Local Experience Packs" #=================================================================================================== # Execute #=================================================================================================== foreach ($Update in $LocalExperiencePacks) { if (Test-Path "$SetOSDBuilderPathContent\$Update") { Write-Host "$SetOSDBuilderPathContent\$Update" -ForegroundColor DarkGray Add-AppxProvisionedPackage -Path "$MountDirectory" -PackagePath "$SetOSDBuilderPathContent\$Update" -LicensePath "$((Get-Item $SetOSDBuilderPathContent\$Update).Directory.FullName)\License.xml" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-LocalExperiencePacksOS.log" | Out-Null } else { Write-Warning "Not Found: $SetOSDBuilderPathContent\$Update" } } } function Add-WindowsPackageOS { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if ($ScriptName -ne 'New-OSBuild') {Return} #=================================================================================================== # Task #=================================================================================================== if ([string]::IsNullOrWhiteSpace($Packages)) {Return} Show-ActionTime; Write-Host -ForegroundColor Green "OS: Add Packages" foreach ($PackagePath in $Packages) { Write-Host "$SetOSDBuilderPathContent\$PackagePath" -ForegroundColor DarkGray $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Add-WindowsPackageOS.log" Try { Add-WindowsPackage -PackagePath "$SetOSDBuilderPathContent\$PackagePath" -Path "$MountDirectory" -LogPath $CurrentLog | Out-Null } Catch { if ($_.Exception.Message -match '0x800f081e') {Write-Verbose "OSDBuilder: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose "OSDBuilder: Review the log for more information" -Verbose Write-Verbose "$CurrentLog" -Verbose } } } function Copy-MediaLanguageSources { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if ($ScriptName -ne 'New-OSBuild') {Return} if ($OSMajorVersion -ne 10) {Return} if ([string]::IsNullOrWhiteSpace($LanguageCopySources)) {Return} #=================================================================================================== # Header #=================================================================================================== Show-ActionTime Write-Host -ForegroundColor Green "OS: Language Sources" #=================================================================================================== # Execute #=================================================================================================== foreach ($LanguageSource in $LanguageCopySources) { $CurrentLanguageSource = Get-OSMedia -Revision OK | Where-Object {$_.OSMFamily -eq $LanguageSource} | Select-Object -Property FullName Write-Host "Copying Language Resources from $($CurrentLanguageSource.FullName)" -ForegroundColor DarkGray robocopy "$($CurrentLanguageSource.FullName)\OS" "$OS" *.* /e /xf *.wim /ndl /xc /xn /xo /xf /xx /b /np /ts /tee /r:0 /w:0 /Log+:"$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Copy-MediaLanguageSources.log" | Out-Null } #=================================================================================================== } function Copy-MediaOperatingSystem { [CmdletBinding()] Param () #=================================================================================================== # Header #=================================================================================================== Show-ActionTime Write-Host -ForegroundColor Green "MEDIA: Copy Operating System to $WorkingPath" #=================================================================================================== # Execute #=================================================================================================== #Copy-Item -Path "$OSMediaPath\*" -Destination "$WorkingPath" -Exclude ('*.wim','*.iso','*.vhd','*.vhx') -Recurse -Force | Out-Null robocopy "$OSMediaPath" "$WorkingPath" *.* /s /r:0 /w:0 /nfl /ndl /xf *.wim *.iso *.vhd *.vhx *.vhdx | Out-Null if (Test-Path "$WorkingPath\ISO") {Remove-Item -Path "$WorkingPath\ISO" -Force -Recurse | Out-Null} if (Test-Path "$WorkingPath\VHD") {Remove-Item -Path "$WorkingPath\VHD" -Force -Recurse | Out-Null} #Copy-Item -Path "$OSMediaPath\OS\sources\install.wim" -Destination "$WimTemp\install.wim" -Force | Out-Null robocopy "$OSMediaPath\OS\sources" "$WimTemp" install.wim /r:0 /w:0 /nfl /ndl | Out-Null #Copy-Item -Path "$OSMediaPath\WinPE\*.wim" -Destination "$WimTemp" -Exclude boot.wim -Force | Out-Null robocopy "$OSMediaPath\WinPE" "$WimTemp" *.wim /r:0 /w:0 /nfl /ndl /xf boot.wim | Out-Null } function Disable-WindowsOptionalFeatureOS { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if ($ScriptName -ne 'New-OSBuild') {Return} if ([string]::IsNullOrWhiteSpace($DisableFeature)) {Return} #=================================================================================================== # Header #=================================================================================================== Show-ActionTime Write-Host -ForegroundColor Green "OS: Disable Windows Optional Feature" #=================================================================================================== # Execute #=================================================================================================== foreach ($FeatureName in $DisableFeature) { Write-Host $FeatureName -ForegroundColor DarkGray Try { Disable-WindowsOptionalFeature -FeatureName $FeatureName -Path "$MountDirectory" -LogPath "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Disable-WindowsOptionalFeature.log" | Out-Null } Catch { $ErrorMessage = $_.Exception.Message Write-Warning "$ErrorMessage" } } #=================================================================================================== } function Dismount-InstallwimOS { [CmdletBinding()] Param () #=================================================================================================== # Header #=================================================================================================== Show-ActionTime Write-Host -ForegroundColor Green "OS: Dismount from $MountDirectory" #=================================================================================================== # Execute #=================================================================================================== if ($WaitDismount.IsPresent){[void](Read-Host 'Press Enter to Continue')} $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dismount-WindowsImage.log" Write-Verbose "CurrentLog: $CurrentLog" Start-Sleep -Seconds 10 try { Dismount-WindowsImage -Path "$MountDirectory" -Save -LogPath "$CurrentLog" -ErrorAction SilentlyContinue | Out-Null } catch { Write-Warning "Could not dismount Install.wim ... Waiting 30 seconds ..." Start-Sleep -Seconds 30 Dismount-WindowsImage -Path "$MountDirectory" -Save -LogPath "$CurrentLog" | Out-Null } #=================================================================================================== } function Dismount-OSDOfflineRegistry { [CmdletBinding()] Param ( [Parameter(Mandatory)] [string]$MountPath ) #====================================================================================== # Dismount-RegistryHives #====================================================================================== if (($MountPath) -and (Test-Path "$MountPath" -ErrorAction SilentlyContinue)) { if (Test-Path -Path "HKLM:\OfflineDefaultUser") { Write-Verbose "Unloading Registry HKLM\OfflineDefaultUser" Start-Process reg -ArgumentList "unload HKLM\OfflineDefaultUser" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue } if (Test-Path -Path "HKLM:\OfflineDefault") { Write-Verbose "Unloading Registry HKLM\OfflineDefault" Start-Process reg -ArgumentList "unload HKLM\OfflineDefault" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue } if (Test-Path -Path "HKLM:\OfflineSoftware") { Write-Verbose "Unloading Registry HKLM\OfflineSoftware" Start-Process reg -ArgumentList "unload HKLM\OfflineSoftware" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue } if (Test-Path -Path "HKLM:\OfflineSystem") { Write-Verbose "Unloading Registry HKLM\OfflineSystem" Start-Process reg -ArgumentList "unload HKLM\OfflineSystem" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue } if (Test-Path -Path "HKLM:\OfflineDefaultUser") { Write-Verbose "Unloading Registry HKLM\OfflineDefaultUser (Second Attempt)" Start-Process reg -ArgumentList "unload HKLM\OfflineDefaultUser" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue } if (Test-Path -Path "HKLM:\OfflineDefault") { Write-Verbose "Unloading Registry HKLM\OfflineDefault (Second Attempt)" Start-Process reg -ArgumentList "unload HKLM\OfflineDefault" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue } if (Test-Path -Path "HKLM:\OfflineSoftware") { Write-Verbose "Unloading Registry HKLM\OfflineSoftware (Second Attempt)" Start-Process reg -ArgumentList "unload HKLM\OfflineSoftware" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue } if (Test-Path -Path "HKLM:\OfflineSystem") { Write-Verbose "Unloading Registry HKLM\OfflineSystem (Second Attempt)" Start-Process reg -ArgumentList "unload HKLM\OfflineSystem" -Wait -WindowStyle Hidden -ErrorAction SilentlyContinue } if (Test-Path -Path "HKLM:\OfflineDefaultUser") { Write-Warning "HKLM:\OfflineDefaultUser could not be dismounted. Open Regedit and unload the Hive manually" Pause } if (Test-Path -Path "HKLM:\OfflineDefault") { Write-Warning "HKLM:\OfflineDefault could not be dismounted. Open Regedit and unload the Hive manually" Pause } if (Test-Path -Path "HKLM:\OfflineSoftware") { Write-Warning "HKLM:\OfflineSoftware could not be dismounted. Open Regedit and unload the Hive manually" Pause } if (Test-Path -Path "HKLM:\OfflineSystem") { Write-Warning "HKLM:\OfflineSystem could not be dismounted. Open Regedit and unload the Hive manually" Pause } } } function Dismount-WimsPE { [CmdletBinding()] Param ( [string]$OSMediaPath ) #=================================================================================================== # Header #=================================================================================================== Show-ActionTime Write-Host -ForegroundColor Green "WinPE: Dismount-WimsPE" #=================================================================================================== # Execute #=================================================================================================== Start-Sleep -Seconds 10 Write-Verbose "$MountWinPE" $CurrentLog = "$OSMediaPath\WinPE\info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dismount-WimsPE-WinPE.log" Write-Verbose "CurrentLog: $CurrentLog" try { Dismount-WindowsImage -Path "$MountWinPE" -Save -LogPath "$CurrentLog" -ErrorAction SilentlyContinue | Out-Null } catch { Write-Warning "Could not dismount WinPE ... Waiting 30 seconds ..." Start-Sleep -Seconds 30 Dismount-WindowsImage -Path "$MountWinPE" -Save -LogPath "$CurrentLog" | Out-Null } Write-Verbose "$MountWinRE" $CurrentLog = "$OSMediaPath\WinPE\info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dismount-WimsPE-WinRE.log" Write-Verbose "CurrentLog: $CurrentLog" try { Dismount-WindowsImage -Path "$MountWinRE" -Save -LogPath "$CurrentLog" -ErrorAction SilentlyContinue | Out-Null } catch { Write-Warning "Could not dismount WinRE ... Waiting 30 seconds ..." Start-Sleep -Seconds 30 Dismount-WindowsImage -Path "$MountWinRE" -Save -LogPath "$CurrentLog" | Out-Null } Write-Verbose "$MountWinSE" $CurrentLog = "$OSMediaPath\WinPE\info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Dismount-WimsPE-WinSE.log" Write-Verbose "CurrentLog: $CurrentLog" try { Dismount-WindowsImage -Path "$MountWinSE" -Save -LogPath "$CurrentLog" -ErrorAction SilentlyContinue | Out-Null } catch { Write-Warning "Could not dismount WinSE ... Waiting 30 seconds ..." Start-Sleep -Seconds 30 Dismount-WindowsImage -Path "$MountWinSE" -Save -LogPath "$CurrentLog" | Out-Null } #=================================================================================================== } function Enable-NetFXOS { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if ($ScriptName -ne 'New-OSBuild') {Return} if ($EnableNetFX3 -ne $true) {Return} if ($OSMajorVersion -ne 10) {Return} #=================================================================================================== # Header #=================================================================================================== Show-ActionTime Write-Host -ForegroundColor Green "OS: Enable NetFX 3.5" #=================================================================================================== # Execute #=================================================================================================== $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Enable-NetFXOS.log" Write-Verbose "CurrentLog: $CurrentLog" Try { Enable-WindowsOptionalFeature -Path "$MountDirectory" -FeatureName NetFX3 -All -LimitAccess -Source "$OS\sources\sxs" -LogPath "$CurrentLog" | Out-Null } Catch { $ErrorMessage = $_.Exception.Message Write-Warning "$ErrorMessage" } #=================================================================================================== # Post Action #=================================================================================================== Update-DotNetOS -Force Update-CumulativeOS -Force #=================================================================================================== } function Enable-WindowsOptionalFeatureOS { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if ($ScriptName -ne 'New-OSBuild') {Return} if ([string]::IsNullOrWhiteSpace($EnableFeature)) {Return} #=================================================================================================== # Header #=================================================================================================== Show-ActionTime Write-Host -ForegroundColor Green "OS: Enable Windows Optional Feature" #=================================================================================================== # Execute #=================================================================================================== foreach ($FeatureName in $EnableFeature) { Write-Host $FeatureName -ForegroundColor DarkGray Try { $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Enable-WindowsOptionalFeatureOS.log" Write-Verbose "CurrentLog: $CurrentLog" Enable-WindowsOptionalFeature -FeatureName $FeatureName -Path "$MountDirectory" -All -LogPath "$CurrentLog" | Out-Null } Catch { $ErrorMessage = $_.Exception.Message Write-Warning "$ErrorMessage" } } #=================================================================================================== # Post Action #=================================================================================================== Update-CumulativeOS -Force Invoke-DismCleanupImage #=================================================================================================== } function Expand-DaRTPE { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if (($ScriptName -ne 'New-OSBuild') -and ($ScriptName -ne 'New-PEBuild')) {Return} if ([string]::IsNullOrWhiteSpace($WinPEDaRT)) {Return} #=================================================================================================== # Header #=================================================================================================== $MicrosoftDartCab = "$SetOSDBuilderPathContent\$WinPEDaRT" Show-ActionTime; Write-Host -ForegroundColor Green "Microsoft DaRT: $MicrosoftDartCab" #=================================================================================================== # Execute #=================================================================================================== if (Test-Path "$MicrosoftDartCab") { if ($MountWinPE) {expand.exe "$MicrosoftDartCab" -F:*.* "$MountWinPE" | Out-Null} if ($MountWinRE) {expand.exe "$MicrosoftDartCab" -F:*.* "$MountWinRE" | Out-Null} if ($MountWinSE) {expand.exe "$MicrosoftDartCab" -F:*.* "$MountWinSE" | Out-Null} $MicrosoftDartConfig = $(Join-Path $(Split-Path "$MicrosoftDartCab") 'DartConfig.dat') if (Test-Path $MicrosoftDartConfig) { if ($MountWinPE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinPE\Windows\System32\DartConfig.dat" -Force} if ($MountWinRE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinSE\Windows\System32\DartConfig.dat" -Force} if ($MountWinSE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinRE\Windows\System32\DartConfig.dat" -Force} } $MicrosoftDartConfig = $(Join-Path $(Split-Path "$MicrosoftDartCab") 'DartConfig8.dat') if (Test-Path $MicrosoftDartConfig) { if ($MountWinPE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinPE\Windows\System32\DartConfig.dat" -Force} if ($MountWinRE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinSE\Windows\System32\DartConfig.dat" -Force} if ($MountWinSE) {Copy-Item -Path $MicrosoftDartConfig -Destination "$MountWinRE\Windows\System32\DartConfig.dat" -Force} } if ($ScriptName -eq 'New-OSBuild') { if (Test-Path "$MountWinPE\Windows\System32\winpeshl.ini") {Remove-Item -Path "$MountWinPE\Windows\System32\winpeshl.ini" -Force} (Get-Content "$MountWinRE\Windows\System32\winpeshl.ini") | ForEach-Object {$_ -replace '-prompt','-network'} | Out-File "$MountWinRE\Windows\System32\winpeshl.ini" if (Test-Path "$MountWinSE\Windows\System32\winpeshl.ini") {Remove-Item -Path "$MountWinSE\Windows\System32\winpeshl.ini" -Force} } if ($ScriptName -eq 'New-PEBuild') { if ($WinPEOutput -eq 'Recovery') { (Get-Content "$MountDirectory\Windows\System32\winpeshl.ini") | ForEach-Object {$_ -replace '-prompt','-network'} | Out-File "$MountDirectory\Windows\System32\winpeshl.ini" } else { if (Test-Path "$MountDirectory\Windows\System32\winpeshl.ini") {Remove-Item -Path "$MountDirectory\Windows\System32\winpeshl.ini" -Force} } } } else {Write-Warning "Microsoft DaRT do not exist in $MicrosoftDartCab"} } function Export-InstallwimOS { [CmdletBinding()] Param () #=================================================================================================== # Header #=================================================================================================== Show-ActionTime Write-Host -ForegroundColor Green "OS: Export to $OS\sources\install.wim" #=================================================================================================== # Execute #=================================================================================================== $CurrentLog = "$Info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Export-WindowsImage.log" Write-Verbose "CurrentLog: $CurrentLog" Export-WindowsImage -SourceImagePath "$WimTemp\install.wim" -SourceIndex 1 -DestinationImagePath "$OS\sources\install.wim" -LogPath "$CurrentLog" | Out-Null } function Export-PEBootWim { [CmdletBinding()] Param ( [string]$OSMediaPath ) #=================================================================================================== # Header #=================================================================================================== Show-ActionTime Write-Host -ForegroundColor Green "WinPE: Rebuild $OSMediaPath\OS\sources\boot.wim" #=================================================================================================== # Execute #=================================================================================================== $CurrentLog = "$OSMediaPath\WinPE\info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Export-WindowsImage-WinPE.log" Write-Verbose "CurrentLog: $CurrentLog" Export-WindowsImage -SourceImagePath "$OSMediaPath\WimTemp\winpe.wim" -SourceIndex 1 -DestinationImagePath "$OSMediaPath\WinPE\boot.wim" -LogPath "$CurrentLog" | Out-Null $CurrentLog = "$OSMediaPath\WinPE\info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Export-WindowsImage-WinSE.log" Write-Verbose "CurrentLog: $CurrentLog" Export-WindowsImage -SourceImagePath "$OSMediaPath\WimTemp\winse.wim" -SourceIndex 1 -DestinationImagePath "$OSMediaPath\WinPE\boot.wim" -Setbootable -LogPath "$CurrentLog" | Out-Null Copy-Item -Path "$OSMediaPath\WinPE\boot.wim" -Destination "$OSMediaPath\OS\sources\boot.wim" -Force | Out-Null } function Export-PEWims { [CmdletBinding()] Param ( [string]$OSMediaPath ) #=================================================================================================== # Header #=================================================================================================== Show-ActionTime Write-Host -ForegroundColor Green "WinPE: Export WIMs to $OSMediaPath\WinPE" #=================================================================================================== # Execute #=================================================================================================== $CurrentLog = "$OSMediaPath\WinPE\info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Export-WindowsImage-WinPE.log" Write-Verbose "CurrentLog: $CurrentLog" Export-WindowsImage -SourceImagePath "$OSMediaPath\WimTemp\winpe.wim" -SourceIndex 1 -DestinationImagePath "$OSMediaPath\WinPE\winpe.wim" -LogPath "$CurrentLog" | Out-Null $CurrentLog = "$OSMediaPath\WinPE\info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Export-WindowsImage-WinRE.log" Write-Verbose "CurrentLog: $CurrentLog" Export-WindowsImage -SourceImagePath "$OSMediaPath\WimTemp\winre.wim" -SourceIndex 1 -DestinationImagePath "$OSMediaPath\WinPE\winre.wim" -LogPath "$CurrentLog" | Out-Null $CurrentLog = "$OSMediaPath\WinPE\info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Export-WindowsImage-WinSE.log" Write-Verbose "CurrentLog: $CurrentLog" Export-WindowsImage -SourceImagePath "$OSMediaPath\WimTemp\winse.wim" -SourceIndex 1 -DestinationImagePath "$OSMediaPath\WinPE\winse.wim" -LogPath "$CurrentLog" | Out-Null } function Export-SessionsXmlOS { [CmdletBinding()] Param ( [string]$OSMediaPath ) Write-Verbose "$OSMediaPath\Sessions.xml" Copy-Item "$OSMediaPath\Sessions.xml" "$OSMediaPath\info\Sessions.xml" -Force | Out-Null [xml]$SessionsXML = Get-Content -Path "$OSMediaPath\info\Sessions.xml" $Sessions = $SessionsXML.SelectNodes('Sessions/Session') | ForEach-Object { New-Object -Type PSObject -Property @{ Id = $_.Tasks.Phase.package.id KBNumber = $_.Tasks.Phase.package.name TargetState = $_.Tasks.Phase.package.targetState Client = $_.Client Complete = $_.Complete Status = $_.Status } } $Sessions = $Sessions | Where-Object {$_.Id -like "Package*"} $Sessions = $Sessions | Select-Object -Property Id, KBNumber, TargetState, Client, Status, Complete | Sort-Object Complete -Descending $Sessions | Out-File "$OSMediaPath\Sessions.txt" $Sessions | Out-File "$OSMediaPath\info\logs\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Sessions.txt" $Sessions | Export-Clixml -Path "$OSMediaPath\info\xml\Sessions.xml" $Sessions | Export-Clixml -Path "$OSMediaPath\info\xml\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Sessions.xml" $Sessions | ConvertTo-Json | Out-File "$OSMediaPath\info\json\Sessions.json" $Sessions | ConvertTo-Json | Out-File "$OSMediaPath\info\json\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Sessions.json" Remove-Item "$OSMediaPath\Sessions.xml" -Force | Out-Null } function Get-FeatureUpdateDownloads { $FeatureUpdateDownloads = @() $FeatureUpdateDownloads = Get-OSDSUS FeatureUpdate <# $CatalogsXmls = @() $CatalogsXmls = Get-ChildItem "$($MyInvocation.MyCommand.Module.ModuleBase)\CatalogsESD\*" -Include *.xml foreach ($CatalogsXml in $CatalogsXmls) { $FeatureUpdateDownloads += Import-Clixml -Path "$($CatalogsXml.FullName)" } #> #=================================================================================================== # Get Downloadeds #=================================================================================================== foreach ($Download in $FeatureUpdateDownloads) { $FullUpdatePath = Join-Path $SetOSDBuilderPathFeatureUpdates $Download.FileName if (Test-Path $FullUpdatePath) { $Download.OSDStatus = "Downloaded" } } #=================================================================================================== # Return #=================================================================================================== $FeatureUpdateDownloads = $FeatureUpdateDownloads | Select-Object -Property * | Sort-Object -Property CreationDate -Descending Return $FeatureUpdateDownloads } function Get-IsContentPacksEnabled { [CmdletBinding()] Param () if ($global:SetOSDBuilder.AllowContentPacks -eq $false) {Return $false} if (Test-Path $SetOSDBuilderPathTemplates\Drivers) {Return $false} if (Test-Path $SetOSDBuilderPathTemplates\ExtraFiles) {Return $false} if (Test-Path $SetOSDBuilderPathTemplates\Registry) {Return $false} if (Test-Path $SetOSDBuilderPathTemplates\Scripts) {Return $false} Return $true } function Get-IsTemplatesEnabled { #Is Templates Content enabled [CmdletBinding()] Param () if (Test-Path $SetOSDBuilderPathTemplates\Drivers) {Return $true} if (Test-Path $SetOSDBuilderPathTemplates\ExtraFiles) {Return $true} if (Test-Path $SetOSDBuilderPathTemplates\Registry) {Return $true} if (Test-Path $SetOSDBuilderPathTemplates\Scripts) {Return $true} Return $false } function Get-OSBuildTask { [CmdletBinding()] Param ( [switch]$GridView ) Begin { #Write-Host '========================================================================================' -ForegroundColor DarkGray #Write-Host "$($MyInvocation.MyCommand.Name) BEGIN" #=================================================================================================== Write-Verbose '19.1.1 Initialize OSDBuilder' #=================================================================================================== Get-OSDBuilder -CreatePaths -HideDetails #=================================================================================================== Write-Verbose '19.1.1 Gather All OSBuildTask' #=================================================================================================== $AllOSBuildTasks = @() $AllOSBuildTasks = Get-ChildItem -Path $SetOSDBuilderPathTasks OSBuild*.json -File | Select-Object -Property * } Process { #Write-Host '========================================================================================' -ForegroundColor DarkGray #Write-Host "$($MyInvocation.MyCommand.Name) PROCESS" $OSBuildTask = foreach ($Item in $AllOSBuildTasks) { #=================================================================================================== #Write-Verbose '19.1.1 Get Windows Image Information' #=================================================================================================== $OSBuildTaskPath = $($Item.FullName) Write-Verbose "OSBuildTask Full Path: $OSBuildTaskPath" $OSBTask = @() $OSBTask = Get-Content "$($Item.FullName)" | ConvertFrom-Json $OSBTaskProps = @() $OSBTaskProps = Get-Item "$($Item.FullName)" | Select-Object -Property * if ([System.Version]$OSBTask.TaskVersion -lt [System.Version]"19.1.3.0") { $ObjectProperties = @{ LastWriteTime = $OSBTaskProps.LastWriteTime TaskName = $OSBTask.TaskName TaskVersion = $OSBTask.TaskVersion OSMediaName = $OSBTask.MediaName FullName = $Item.FullName } New-Object -TypeName PSObject -Property $ObjectProperties Write-Verbose "" } if ([System.Version]$OSBTask.TaskVersion -gt [System.Version]"19.1.3.0") { if ($null -eq $OSBTask.Languages) { Write-Warning "Reading Task: $OSBuildTaskPath" Write-Warning "Searching for OSMFamily: $($OSBTask.OSMFamily)" $LangUpdate = Get-OSMedia | Where-Object {$_.OSMFamilyV1 -eq $OSBTask.OSMFamily} | Select-Object -Last 1 Write-Warning "Adding Language: $($LangUpdate.Languages)" $OSBTask | Add-Member -Type NoteProperty -Name 'Languages' -Value "$LangUpdate.Languages" $OSBTask.Languages = $LangUpdate.Languages $OSBTask.OSMFamily = $OSBTask.InstallationType + " " + $OSBTask.EditionId + " " + $OSBTask.Arch + " " + [string]$OSBTask.Build + " " + $OSBTask.Languages Write-Warning "Updating OSMFamily: $($OSBTask.OSMFamily)" Write-Warning "Updating Task: $OSBuildTaskPath" $OSBTask | ConvertTo-Json | Out-File $OSBuildTaskPath Write-Host "" } $ObjectProperties = @{ TaskType = $OSBTask.TaskType TaskVersion = $OSBTask.TaskVersion TaskName = $OSBTask.TaskName TaskGuid = $OSBTask.TaskGuid CustomName = $OSBTask.CustomName SourceOSMedia = $OSBTask.Name ImageName = $OSBTask.ImageName Arch = $OSBTask.Arch ReleaseId = $OSBTask.ReleaseId UBR = $OSBTask.UBR Languages = $OSBTask.Languages EditionId = $OSBTask.EditionId FullName = $Item.FullName LastWriteTime = $OSBTaskProps.LastWriteTime CreatedTime = [datetime]$OSBTask.CreatedTime ModifiedTime = [datetime]$OSBTask.ModifiedTime OSMFamily = $OSBTask.OSMFamily OSMGuid = $OSBTask.OSMGuid } New-Object -TypeName PSObject -Property $ObjectProperties Write-Verbose "" } } #=================================================================================================== #Write-Verbose '19.1.3 Output' #=================================================================================================== if ($GridView.IsPresent) {$OSBuildTask | Select-Object TaskType,TaskVersion,TaskName,CustomName,SourceOSMedia,ImageName,Arch,ReleaseId,UBR,Languages,EditionId,FullName,LastWriteTime,OSMFamily,OSMGuid | Sort-Object TaskName | Out-GridView -PassThru -Title 'OSBuildTask'} else {$OSBuildTask | Select-Object TaskType,TaskVersion,TaskName,CustomName,SourceOSMedia,ImageName,Arch,ReleaseId,UBR,Languages,EditionId,FullName,LastWriteTime,OSMFamily,OSMGuid | Sort-Object TaskName } } END { #Write-Host '========================================================================================' -ForegroundColor DarkGray #Write-Host "$($MyInvocation.MyCommand.Name) END" } } function Get-OSDFromJson { param( [Parameter(Mandatory=$true, Position=1)] [string]$Path ) function Get-Value { param( $value ) $result = $null if ( $value -is [System.Management.Automation.PSCustomObject] ) { Write-Verbose "Get-Value: value is PSCustomObject" $result = @{} $value.psobject.properties | ForEach-Object { $result[$_.Name] = Get-Value -value $_.Value } } elseif ($value -is [System.Object[]]) { $list = New-Object System.Collections.ArrayList Write-Verbose "Get-Value: value is Array" $value | ForEach-Object { $list.Add((Get-Value -value $_)) | Out-Null } $result = $list } else { Write-Verbose "Get-Value: value is type: $($value.GetType())" $result = $value } return $result } if (Test-Path $Path) { $json = Get-Content $Path -Raw } else { $json = '{}' } $hashtable = Get-Value -value (ConvertFrom-Json $json) return $hashtable } function Get-OSDUpdateDownloads { [CmdletBinding()] Param ( [string]$OSDGuid, [string]$UpdateTitle, [switch]$Silent ) #=================================================================================================== # Filtering #=================================================================================================== if ($OSDGuid) { $OSDUpdateDownload = Get-OSDUpdates -Silent | Where-Object {$_.OSDGuid -eq $OSDGuid} } elseif ($UpdateTitle) { $OSDUpdateDownload = Get-OSDUpdates -Silent | Where-Object {$_.UpdateTitle -eq $UpdateTitle} } else { Break } #=================================================================================================== # Download #=================================================================================================== foreach ($Update in $OSDUpdateDownload) { $DownloadPath = "$SetOSDBuilderPathUpdates\$($Update.Catalog)\$($Update.Title)" $DownloadFullPath = "$DownloadPath\$($Update.FileName)" if (!(Test-Path $DownloadPath)) {New-Item -Path "$DownloadPath" -ItemType Directory -Force | Out-Null} if (!(Test-Path $DownloadFullPath)) { Write-Host "$DownloadFullPath" Write-Host "$($Update.OriginUri)" -ForegroundColor Gray $WebClient = New-Object System.Net.WebClient $WebClient.DownloadFile("$($Update.OriginUri)","$DownloadFullPath") #Start-BitsTransfer -Source $Update.OriginUri -Destination $DownloadFullPath } } } function Get-OSDUpdates { Param ( [switch]$Silent ) $AllOSDUpdates = @() if ($Silent.IsPresent) { $AllOSDUpdates = Get-OSDSUS Windows -Silent } else { $AllOSDUpdates = Get-OSDSUS Windows } Write-Verbose "" <# $CatalogsXmls = @() $CatalogsXmls = Get-ChildItem "$($MyInvocation.MyCommand.Module.ModuleBase)\Catalogs\*" -Include *.xml foreach ($CatalogsXml in $CatalogsXmls) { $AllOSDUpdates += Import-Clixml -Path "$($CatalogsXml.FullName)" } #> #=================================================================================================== # Standard Filters #=================================================================================================== <# $AllOSDUpdates = $AllOSDUpdates | Where-Object {$_.FileName -notlike "*.exe"} $AllOSDUpdates = $AllOSDUpdates | Where-Object {$_.FileName -notlike "*.psf"} $AllOSDUpdates = $AllOSDUpdates | Where-Object {$_.FileName -notlike "*.txt"} $AllOSDUpdates = $AllOSDUpdates | Where-Object {$_.FileName -notlike "*delta.exe"} $AllOSDUpdates = $AllOSDUpdates | Where-Object {$_.FileName -notlike "*express.cab"} $AllOSDUpdates = $AllOSDUpdates | Where-Object {$_.Title -notlike "* Next *"} #> #=================================================================================================== # Get Downloaded Updates #=================================================================================================== foreach ($Update in $AllOSDUpdates) { $FullUpdatePath = "$SetOSDBuilderPathUpdates\$($Update.Catalog)\$($Update.Title)\$($Update.FileName)" if (Test-Path $FullUpdatePath) { $Update.OSDStatus = "Downloaded" } } #=================================================================================================== # Return #=================================================================================================== $AllOSDUpdates = $AllOSDUpdates | Select-Object -Property * Return $AllOSDUpdates } function Get-OSTemplateDrivers { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if (Get-IsContentPacksEnabled) {Return} #=================================================================================================== # Process #=================================================================================================== $DriverTemplates = @() #Write-Host "$SetOSDBuilderPathTemplates\Drivers\AutoApply\Global" -ForegroundColor Gray [array]$DriverTemplates = Get-Item "$SetOSDBuilderPathTemplates\Drivers\AutoApply\Global" #Write-Host "$SetOSDBuilderPathTemplates\Drivers\AutoApply\Global $OSArchitecture" -ForegroundColor Gray [array]$DriverTemplates += Get-Item "$SetOSDBuilderPathTemplates\Drivers\AutoApply\Global $OSArchitecture" #Write-Host "$SetOSDBuilderPathTemplates\Drivers\AutoApply\$UpdateOS" -ForegroundColor Gray [array]$DriverTemplates += Get-Item "$SetOSDBuilderPathTemplates\Drivers\AutoApply\$UpdateOS" if ($OSInstallationType -notlike "*Server*") { #Write-Host "$SetOSDBuilderPathTemplates\Drivers\AutoApply\$UpdateOS $OSArchitecture" -ForegroundColor Gray [array]$DriverTemplates += Get-Item "$SetOSDBuilderPathTemplates\Drivers\AutoApply\$UpdateOS $OSArchitecture" } if ($OSInstallationType -notlike "*Server*" -and $OSMajorVersion -eq 10) { #Write-Host "$SetOSDBuilderPathTemplates\Drivers\AutoApply\$UpdateOS $OSArchitecture $ReleaseId" -ForegroundColor Gray [array]$DriverTemplates += Get-Item "$SetOSDBuilderPathTemplates\Drivers\AutoApply\$UpdateOS $OSArchitecture $ReleaseId" } Return $DriverTemplates } function Get-OSTemplateExtraFiles { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if (Get-IsContentPacksEnabled) {Return} #=================================================================================================== # Process #=================================================================================================== $ExtraFilesTemplates = @() #Write-Host "$SetOSDBuilderPathTemplates\ExtraFiles\AutoApply\Global" -ForegroundColor DarkGray [array]$ExtraFilesTemplates = Get-ChildItem "$SetOSDBuilderPathTemplates\ExtraFiles\AutoApply\Global" | Where-Object {$_.PSIsContainer -eq $true} #Write-Host "$SetOSDBuilderPathTemplates\ExtraFiles\AutoApply\Global $OSArchitecture" -ForegroundColor DarkGray [array]$ExtraFilesTemplates += Get-ChildItem "$SetOSDBuilderPathTemplates\ExtraFiles\AutoApply\Global $OSArchitecture" | Where-Object {$_.PSIsContainer -eq $true} #Write-Host "$SetOSDBuilderPathTemplates\ExtraFiles\AutoApply\$UpdateOS" -ForegroundColor DarkGray [array]$ExtraFilesTemplates += Get-ChildItem "$SetOSDBuilderPathTemplates\ExtraFiles\AutoApply\$UpdateOS" | Where-Object {$_.PSIsContainer -eq $true} if ($OSInstallationType -notlike "*Server*") { #Write-Host "$SetOSDBuilderPathTemplates\ExtraFiles\AutoApply\$UpdateOS $OSArchitecture" -ForegroundColor DarkGray [array]$ExtraFilesTemplates += Get-ChildItem "$SetOSDBuilderPathTemplates\ExtraFiles\AutoApply\$UpdateOS $OSArchitecture" | Where-Object {$_.PSIsContainer -eq $true} } if ($OSInstallationType -notlike "*Server*" -and $OSMajorVersion -eq 10) { #Write-Host "$SetOSDBuilderPathTemplates\ExtraFiles\AutoApply\$UpdateOS $OSArchitecture $ReleaseId" -ForegroundColor DarkGray [array]$ExtraFilesTemplates += Get-ChildItem "$SetOSDBuilderPathTemplates\ExtraFiles\AutoApply\$UpdateOS $OSArchitecture $ReleaseId" | Where-Object {$_.PSIsContainer -eq $true} } Return $ExtraFilesTemplates } function Get-OSTemplateRegistryReg { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if (Get-IsContentPacksEnabled) {Return} #=================================================================================================== # Process #=================================================================================================== $RegistryTemplatesRegOriginal = @() $RegistryTemplatesRegOriginal = Get-ChildItem "$SetOSDBuilderPathTemplates\Registry\AutoApply" *.reg -Recurse | Select-Object -Property Name, BaseName, Extension, Directory, FullName foreach ($REG in $RegistryTemplatesRegOriginal) { if (!(Test-Path "$($REG.FullName).Offline")) { Write-Host "Creating $($REG.FullName).Offline" -ForegroundColor DarkGray $REGContent = Get-Content -Path $REG.FullName $REGContent = $REGContent -replace 'HKEY_CURRENT_USER','HKEY_LOCAL_MACHINE\OfflineDefaultUser' $REGContent = $REGContent -replace 'HKEY_LOCAL_MACHINE\\SOFTWARE','HKEY_LOCAL_MACHINE\OfflineSoftware' $REGContent = $REGContent -replace 'HKEY_LOCAL_MACHINE\\SYSTEM','HKEY_LOCAL_MACHINE\OfflineSystem' $REGContent = $REGContent -replace 'HKEY_USERS\\.DEFAULT','HKEY_LOCAL_MACHINE\OfflineDefault' $REGContent | Set-Content "$($REG.FullName).Offline" -Force } } $RegistryTemplatesReg = @() #Write-Host "$SetOSDBuilderPathTemplates\Registry\AutoApply\Global" -ForegroundColor DarkGray [array]$RegistryTemplatesReg = Get-ChildItem "$SetOSDBuilderPathTemplates\Registry\AutoApply\Global\*" *.reg.Offline -Recurse #Write-Host "$SetOSDBuilderPathTemplates\Registry\AutoApply\Global $OSArchitecture" -ForegroundColor DarkGray [array]$RegistryTemplatesReg += Get-ChildItem "$SetOSDBuilderPathTemplates\Registry\AutoApply\Global $OSArchitecture\*" *.reg.Offline -Recurse #Write-Host "$SetOSDBuilderPathTemplates\Registry\AutoApply\$UpdateOS" -ForegroundColor DarkGray [array]$RegistryTemplatesReg += Get-ChildItem "$SetOSDBuilderPathTemplates\Registry\AutoApply\$UpdateOS\*" *.reg.Offline -Recurse if ($OSInstallationType -notlike "*Server*") { #Write-Host "$SetOSDBuilderPathTemplates\Registry\AutoApply\$UpdateOS $OSArchitecture" -ForegroundColor DarkGray [array]$RegistryTemplatesReg += Get-ChildItem "$SetOSDBuilderPathTemplates\Registry\AutoApply\$UpdateOS $OSArchitecture\*" *.reg.Offline -Recurse } if ($OSInstallationType -notlike "*Server*" -and $OSMajorVersion -eq 10) { #Write-Host "$SetOSDBuilderPathTemplates\Registry\AutoApply\$UpdateOS $OSArchitecture $ReleaseId" -ForegroundColor DarkGray [array]$RegistryTemplatesReg += Get-ChildItem "$SetOSDBuilderPathTemplates\Registry\AutoApply\$UpdateOS $OSArchitecture $ReleaseId\*" *.reg.Offline -Recurse } Return $RegistryTemplatesReg } function Get-OSTemplateRegistryXml { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if (Get-IsContentPacksEnabled) {Return} #=================================================================================================== # Process #=================================================================================================== $RegistryTemplatesXml = @() #Write-Host "$SetOSDBuilderPathTemplates\Registry\AutoApply\Global" -ForegroundColor DarkGray [array]$RegistryTemplatesXml = Get-ChildItem "$SetOSDBuilderPathTemplates\Registry\AutoApply\Global\*" *.xml -Recurse #Write-Host "$SetOSDBuilderPathTemplates\Registry\AutoApply\Global $OSArchitecture" -ForegroundColor DarkGray [array]$RegistryTemplatesXml += Get-ChildItem "$SetOSDBuilderPathTemplates\Registry\AutoApply\Global $OSArchitecture\*" *.xml -Recurse #Write-Host "$SetOSDBuilderPathTemplates\Registry\AutoApply\$UpdateOS" -ForegroundColor DarkGray [array]$RegistryTemplatesXml += Get-ChildItem "$SetOSDBuilderPathTemplates\Registry\AutoApply\$UpdateOS\*" *.xml -Recurse if ($OSInstallationType -notlike "*Server*") { #Write-Host "$SetOSDBuilderPathTemplates\Registry\AutoApply\$UpdateOS $OSArchitecture" -ForegroundColor DarkGray [array]$RegistryTemplatesXml += Get-ChildItem "$SetOSDBuilderPathTemplates\Registry\AutoApply\$UpdateOS $OSArchitecture\*" *.xml -Recurse } if ($OSInstallationType -notlike "*Server*" -and $OSMajorVersion -eq 10) { #Write-Host "$SetOSDBuilderPathTemplates\Registry\AutoApply\$UpdateOS $OSArchitecture $ReleaseId" -ForegroundColor DarkGray [array]$RegistryTemplatesXml += Get-ChildItem "$SetOSDBuilderPathTemplates\Registry\AutoApply\$UpdateOS $OSArchitecture $ReleaseId\*" *.xml -Recurse } Return $RegistryTemplatesXml } function Get-OSTemplateScripts { [CmdletBinding()] Param () #=================================================================================================== # Abort #=================================================================================================== if (Get-IsContentPacksEnabled) {Return} #=================================================================================================== # Process #=================================================================================================== $ScriptTemplates = @() #Write-Host "$SetOSDBuilderPathTemplates\Scripts\AutoApply\Global" -ForegroundColor DarkGray [array]$ScriptTemplates = Get-ChildItem "$SetOSDBuilderPathTemplates\Scripts\AutoApply\Global\*" *.ps1 -Recurse #Write-Host "$SetOSDBuilderPathTemplates\Scripts\AutoApply\Global $OSArchitecture" -ForegroundColor DarkGray [array]$ScriptTemplates += Get-ChildItem "$SetOSDBuilderPathTemplates\Scripts\AutoApply\Global $OSArchitecture\*" *.ps1 -Recurse #Write-Host "$SetOSDBuilderPathTemplates\Scripts\AutoApply\$UpdateOS" -ForegroundColor DarkGray [array]$ScriptTemplates += Get-ChildItem "$SetOSDBuilderPathTemplates\Scripts\AutoApply\$UpdateOS\*" *.ps1 -Recurse if ($OSInstallationType -notlike "*Server*") { #Write-Host "$SetOSDBuilderPathTemplates\Scripts\AutoApply\$UpdateOS $OSArchitecture" -ForegroundColor DarkGray [array]$ScriptTemplates += Get-ChildItem "$SetOSDBuilderPathTemplates\Scripts\AutoApply\$UpdateOS $OSArchitecture\*" *.ps1 -Recurse } if ($OSInstallationType -notlike "*Server*" -and $OSMajorVersion -eq 10) { #Write-Host "$SetOSDBuilderPathTemplates\Scripts\AutoApply\$UpdateOS $OSArchitecture $ReleaseId" -ForegroundColor DarkGray [array]$ScriptTemplates += Get-ChildItem "$SetOSDBuilderPathTemplates\Scripts\AutoApply\$UpdateOS $OSArchitecture $ReleaseId\*" *.ps1 -Recurse } Return $ScriptTemplates } function Get-PEBuildTask { [CmdletBinding()] Param ( [switch]$GridView ) BEGIN { #Write-Host '========================================================================================' -ForegroundColor DarkGray #Write-Host "$($MyInvocation.MyCommand.Name) BEGIN" #=================================================================================================== Write-Verbose '19.1.1 Initialize OSDBuilder' #=================================================================================================== Get-OSDBuilder -CreatePaths -HideDetails #=================================================================================================== Write-Verbose '19.1.1 Gather All PEBuildTask' #=================================================================================================== $AllPEBuildTasks = @() $AllPEBuildTasks = Get-ChildItem -Path $SetOSDBuilderPathTasks *.json -File | Select-Object -Property * $AllPEBuildTasks = $AllPEBuildTasks | Where-Object {$_.Name -like "MDT*" -or $_.Name -like "Recovery*" -or $_.Name -like "WinPE*"} } PROCESS { #Write-Host '========================================================================================' -ForegroundColor DarkGray #Write-Host "$($MyInvocation.MyCommand.Name) PROCESS" $PEBuildTask = foreach ($Item in $AllPEBuildTasks) { #=================================================================================================== #Write-Verbose '19.1.1 Get Windows Image Information' #=================================================================================================== $PEBuildTaskPath = $($Item.FullName) Write-Verbose "PEBuildTask Full Path: $PEBuildTaskPath" $PEBTask = @() $PEBTask = Get-Content "$($Item.FullName)" | ConvertFrom-Json $PEBTaskProps = @() $PEBTaskProps = Get-Item "$($Item.FullName)" | Select-Object -Property * if ([System.Version]$PEBTask.TaskVersion -lt [System.Version]"19.1.3.0") { $ObjectProperties = @{ LastWriteTime = $PEBTaskProps.LastWriteTime TaskName = $PEBTask.TaskName TaskVersion = $PEBTask.TaskVersion Name = $PEBTask.MediaName FullName = $Item.FullName } New-Object -TypeName PSObject -Property $ObjectProperties Write-Verbose "" } if ([System.Version]$PEBTask.TaskVersion -gt [System.Version]"19.1.3.0") { if ($null -eq $PEBTask.Languages) { Write-Warning "Reading Task: $PEBuildTaskPath" Write-Warning "Searching for OSMFamily: $($PEBTask.OSMFamily)" $LangUpdate = Get-OSMedia | Where-Object {$_.OSMFamilyV1 -eq $PEBTask.OSMFamily} | Select-Object -Last 1 Write-Warning "Adding Language: $($LangUpdate.Languages)" $PEBTask | Add-Member -Type NoteProperty -Name 'Languages' -Value "$LangUpdate.Languages" $PEBTask.Languages = $LangUpdate.Languages $PEBTask.OSMFamily = $PEBTask.InstallationType + " " + $PEBTask.EditionId + " " + $PEBTask.Arch + " " + [string]$PEBTask.Build + " " + $PEBTask.Languages Write-Warning "Updating OSMFamily: $($PEBTask.OSMFamily)" Write-Warning "Updating Task: $PEBuildTaskPath" $PEBTask | ConvertTo-Json | Out-File $PEBuildTaskPath Write-Host "" } $ObjectProperties = @{ TaskType = $PEBTask.TaskType TaskVersion = $PEBTask.TaskVersion TaskName = $PEBTask.TaskName TaskGuid = $PEBTask.TaskGuid CustomName = $PEBTask.CustomName SourceOSMedia = $PEBTask.Name ImageName = $PEBTask.ImageName Arch = $PEBTask.Arch ReleaseId = $PEBTask.ReleaseId UBR = $PEBTask.UBR EditionId = $PEBTask.EditionId FullName = $Item.FullName LastWriteTime = $PEBTaskProps.LastWriteTime CreatedTime = [datetime]$PEBTask.CreatedTime ModifiedTime = [datetime]$PEBTask.ModifiedTime OSMFamily = $PEBTask.OSMFamily OSMGuid = $PEBTask.OSMGuid } New-Object -TypeName PSObject -Property $ObjectProperties Write-Verbose "" } } #=================================================================================================== #Write-Verbose '19.1.3 Output' #=================================================================================================== if ($GridView.IsPresent) {$PEBuildTask | Select-Object TaskType,TaskVersion,TaskName,CustomName,SourceOSMedia,ImageName,Arch,ReleaseId,UBR,EditionId,FullName,LastWriteTime,OSMFamily,OSMGuid | Sort-Object TaskName | Out-GridView -PassThru -Title 'PEBuildTask'} else {$PEBuildTask | Select-Object TaskType,TaskVersion,TaskName,CustomName,SourceOSMedia,ImageName,Arch,ReleaseId,UBR,EditionId,FullName,LastWriteTime,OSMFamily,OSMGuid | Sort-Object TaskName } } END { #Write-Host '========================================================================================' -ForegroundColor DarkGray #Write-Host "$($MyInvocation.MyCommand.Name) END" } } function Get-RegKeyCurrentVersion { [CmdletBinding()] Param ( [string]$MountPath ) Show-ActionTime; Write-Host "Image: Mount Registry for Windows Information" -ForegroundColor Green if ($MountPath -and (Test-Path $MountPath)) { reg LOAD 'HKLM\OSMedia' "$MountPath\Windows\System32\Config\SOFTWARE" | Out-Null |