Public/General/Start-WimBotCLI.ps1
function Start-DEVWimRobotCLI { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [string]$ImagePath, [Int32]$Index = 1, [switch]$Update ) function Show-WimRobotTime { [CmdletBinding()] param () #================================================= # Show-ActionTime #================================================= $Global:WimRobotTime = Get-Date Write-Host -ForegroundColor DarkGray "$(($Global:WimRobotTime).ToString('yyyy-MM-dd-HHmmss')) " -NoNewline #================================================= } #================================================= # Block #================================================= Show-WimRobotTime; Write-Host 'Verify Admin Rights' Block-StandardUser Show-WimRobotTime; Write-Host 'Verify Windows 10 or Higher' Block-WindowsVersionNe10 #================================================= # Test if ImagePath exists #================================================= Show-WimRobotTime; Write-Host "Test-Path $ImagePath" if (!(Test-Path $ImagePath)) { Show-WimRobotTime; Write-Warning "Unable to find ImagePath at $ImagePath" Break } #================================================= # GetItem #================================================= Show-WimRobotTime; Write-Host "Get-Item -Path $ImagePath" try { $GetImagePath = Get-Item -Path $ImagePath -ErrorAction Stop } catch { Show-WimRobotTime; Write-Warning $_.Exception.Message Break } #================================================= # Test if file is a WIM #================================================= if ($GetImagePath.Extension -ne '.wim') { Show-WimRobotTime; Write-Warning "ImagePath is not a .wim file" Break } #================================================= # Test WindowsImage #================================================= Show-WimRobotTime; Write-Host "Get-WindowsImage -ImagePath $ImagePath -Index $Index" try { $GetWindowsImage = Get-WindowsImage -ImagePath $ImagePath -Index $Index -ErrorAction Stop } catch { Show-WimRobotTime; Write-Warning $_.Exception.Message Break } $GetWindowsImage | Select-Object -Property * #================================================= # Verify WindowsImage #================================================= if ($GetWindowsImage.InstallationType -ne '10') { Show-WimRobotTime; Write-Warning 'MajorVersion 10 is required' Break } if ($GetWindowsImage.InstallationType -ne 'Client') { Show-WimRobotTime; Write-Warning 'InstallationType Server is required' Break } #================================================= # Mount WindowsImage #================================================= Break $MountPath = (Get-Item -Path $Input | Select-Object FullName).FullName Write-Verbose "Path: $MountPath" -Verbose #================================================= # Validate Mount Path #================================================= if (-not (Test-Path $Input -ErrorAction SilentlyContinue)) { Write-Warning "Update-MyWindowsImage: Unable to locate Mounted WindowsImage at $Input" Break } #================================================= # Get Registry Information #================================================= $global:GetRegCurrentVersion = Get-RegCurrentVersion -Path $Input #================================================= # Require OSMajorVersion 10 #================================================= if ($global:GetRegCurrentVersion.CurrentMajorVersionNumber -ne 10) { Write-Warning "Update-MyWindowsImage: OS MajorVersion 10 is required" Break } Write-Verbose -Verbose $global:GetRegCurrentVersion.ReleaseId #================================================= # Get-WSUSXML and Filter Results #================================================= $global:GetWSUSXML = Get-WSUSXML -Catalog Windows | Sort-Object UpdateGroup -Descending if ($global:GetRegCurrentVersion.ReleaseId -gt 0) { $global:GetWSUSXML = $global:GetWSUSXML | Where-Object {$_.UpdateBuild -eq $global:GetRegCurrentVersion.DisplayVersion} } else { $global:GetWSUSXML = $global:GetWSUSXML | Where-Object {$_.UpdateBuild -eq $global:GetRegCurrentVersion.ReleaseId} } if ($global:GetRegCurrentVersion.BuildLabEx -match 'amd64') { $global:GetWSUSXML = $global:GetWSUSXML | Where-Object {$_.UpdateArch -eq 'x64'} } else { $global:GetWSUSXML = $global:GetWSUSXML | Where-Object {$_.UpdateArch -eq 'x86'} } if ($global:GetRegCurrentVersion.InstallationType -match 'WindowsPE') { $global:GetWSUSXML = $global:GetWSUSXML | Where-Object {$_.UpdateOS -eq 'Windows 10'} $global:GetWSUSXML = $global:GetWSUSXML | Where-Object {$_.UpdateGroup -notmatch 'Adobe'} $global:GetWSUSXML = $global:GetWSUSXML | Where-Object {$_.UpdateGroup -notmatch 'DotNet'} } if ($global:GetRegCurrentVersion.InstallationType -match 'Core') { $global:GetWSUSXML = $global:GetWSUSXML | Where-Object {$_.UpdateGroup -notmatch 'Adobe'} } if ($global:GetRegCurrentVersion.InstallationType -match 'Client') { $global:GetWSUSXML = $global:GetWSUSXML | Where-Object {$_.UpdateOS -notmatch 'Server'} } if ($global:GetRegCurrentVersion.InstallationType -match 'Server') { $global:GetWSUSXML = $global:GetWSUSXML | Where-Object {$_.UpdateOS -match 'Server'} } #Don't install Optional Updates $global:GetWSUSXML = $global:GetWSUSXML | Where-Object {$_.UpdateGroup -ne ''} if ($Update -ne 'Check' -and $Update -ne 'All') { $global:GetWSUSXML = $global:GetWSUSXML | Where-Object {$_.UpdateGroup -match $Update} } #================================================= # Get-SessionsXml #================================================= $global:GetSessionsXml = Get-SessionsXml -Path "$Input" | Where-Object {$_.targetState -eq 'Installed'} | Sort-Object id #================================================= # Apply Update #================================================= foreach ($item in $global:GetWSUSXML) { if (! ($Force.IsPresent)) { if ($global:GetSessionsXml | Where-Object {$_.KBNumber -match "$($item.FileKBNumber)"}) { Write-Verbose "Installed: $($item.Title) $($item.FileName)" -Verbose Continue } else { Write-Warning "Not Installed: $($item.Title) $($item.FileName)" } } if ($Update -eq 'Check') {Continue} <# if ($BitsTransfer.IsPresent) { $UpdateFile = Save-OSDDownload -SourceUrl $item.OriginUri -BitsTransfer -Verbose } else { $UpdateFile = Save-OSDDownload -SourceUrl $item.OriginUri -Verbose } #> $UpdateFile = Save-WebFile -SourceUrl $item.OriginUri $CurrentLog = "$env:TEMP\OSD\$((Get-Date).ToString('yyyy-MM-dd-HHmmss'))-Update-MyWindowsImage.log" if (! (Test-Path "$env:TEMP\OSD")) {New-Item -Path "$env:TEMP\OSD" -Force | Out-Null} if (Test-Path $UpdateFile.FullName) { #Write-Verbose "Add-WindowsPackage -PackagePath $($UpdateFile.FullName) -Path $Input" -Verbose Try { Write-Verbose "Add-WindowsPackage -Path $Input -PackagePath $($UpdateFile.FullName)" -Verbose Add-WindowsPackage -Path $Input -PackagePath $UpdateFile.FullName -LogPath $CurrentLog | Out-Null } Catch { if ($_.Exception.Message -match '0x800f081e') { Write-Verbose "Update-MyWindowsImage: 0x800f081e The package is not applicable to this image" -Verbose} Write-Verbose $CurrentLog -Verbose } } else { Write-Warning "Unable to download $($UpdateFile.FullName)" } } #================================================= # Return for PassThru #================================================= Get-WindowsImage -Mounted | Where-Object {$_.Path -eq $MountPath} #================================================= } |