@echo off setlocal EnableExtensions EnableDelayedExpansion :: Elevate to admin if needed net session >nul 2>&1 if not "%errorlevel%"=="0" ( powershell -NoProfile -Command "Start-Process -FilePath '%~f0' -Verb RunAs" exit /b ) :: Pick multiple CABs (returns one line delimited by |) set "CABS=" for /f "usebackq delims=" %%I in (` powershell -NoProfile -Command ^ "Add-Type -AssemblyName System.Windows.Forms; " ^ "$d=New-Object System.Windows.Forms.OpenFileDialog; " ^ "$d.Title='Select Windows Update CAB file(s)'; " ^ "$d.Filter='CAB files (*.cab)|*.cab|All files (*.*)|*.*'; " ^ "$d.Multiselect=$true; " ^ "if($d.ShowDialog() -ne 'OK'){ exit 1 }; " ^ "[string]::Join('|',$d.FileNames)" `) do set "CABS=%%I" if not defined CABS ( powershell -NoProfile -Command ^ "Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.MessageBox]::Show('No files selected.','Install CAB Updates',[System.Windows.Forms.MessageBoxButtons]::OK,[System.Windows.Forms.MessageBoxIcon]::Information) | Out-Null" exit /b 1 ) :: Install each CAB (split on |) set "FAIL=0" set "REBOOT=0" set /a "COUNT=0" set /a "OK=0" set /a "BAD=0" set "SUCCESS=" set "FAILED=" set "REST=%CABS%" :nextcab if not defined REST goto done for /f "delims=| tokens=1*" %%A in ("%REST%") do ( set "CAB=%%A" set "REST=%%B" ) for %%X in ("%CAB%") do set "NAME=%%~nxX" if not exist "%CAB%" ( echo [SKIP] Not found: "%CAB%" set "FAIL=1" set /a "BAD+=1" if defined FAILED (set "FAILED=!FAILED!|!NAME!") else set "FAILED=!NAME!" goto nextcab ) set /a "COUNT+=1" echo. echo -------------------------------------------------- echo Installing (%COUNT%): "%CAB%" echo -------------------------------------------------- dism /Online /Add-Package /PackagePath:"%CAB%" /NoRestart set "RC=%errorlevel%" echo Result: %RC% if "%RC%"=="0" ( set /a "OK+=1" if defined SUCCESS (set "SUCCESS=!SUCCESS!|!NAME!") else set "SUCCESS=!NAME!" ) else if "%RC%"=="3010" ( set "REBOOT=1" set /a "OK+=1" if defined SUCCESS (set "SUCCESS=!SUCCESS!|!NAME!") else set "SUCCESS=!NAME!" ) else ( set "FAIL=1" set /a "BAD+=1" if defined FAILED (set "FAILED=!FAILED!|!NAME!") else set "FAILED=!NAME!" ) goto nextcab :done :: Decide dialog severity set "TITLE=Install CAB Updates" set "ICON=Information" set "STATUS=Completed." if "%REBOOT%"=="1" ( set "ICON=Warning" set "STATUS=Completed. Reboot required." ) if "%FAIL%"=="1" ( set "ICON=Error" set "STATUS=Completed with errors." ) :: Final dialog built entirely in PowerShell (no Replace placeholders) powershell -NoProfile -Command ^ "Add-Type -AssemblyName System.Windows.Forms; Add-Type -AssemblyName System.Drawing; " ^ "$nl=[Environment]::NewLine; " ^ "$status=$env:STATUS; $title=$env:TITLE; " ^ "$count=[int]$env:COUNT; $ok=[int]$env:OK; $bad=[int]$env:BAD; " ^ "$succ=@(); if($env:SUCCESS){ $succ=$env:SUCCESS -split '\|' | Where-Object { $_ -and $_.Trim() } }; " ^ "$fail=@(); if($env:FAILED){ $fail=$env:FAILED -split '\|' | Where-Object { $_ -and $_.Trim() } }; " ^ "$succText = if($succ.Count){ ($succ | ForEach-Object { ' - ' + $_ }) -join $nl } else { ' (none)' }; " ^ "$failText = if($fail.Count){ ($fail | ForEach-Object { ' - ' + $_ }) -join $nl } else { ' (none)' }; " ^ "$msg = $status + $nl + $nl + ('Attempts: ' + $count) + $nl + ('Successful: ' + $ok) + $nl + ('Failed/Skipped: ' + $bad) + $nl + $nl + " ^ " 'Successful CABs:' + $nl + $succText + $nl + $nl + 'Failed/Skipped CABs:' + $nl + $failText; " ^ "$f=New-Object System.Windows.Forms.Form; " ^ "$f.Text=$title; $f.StartPosition='CenterScreen'; $f.FormBorderStyle='FixedDialog'; $f.MaximizeBox=$false; $f.MinimizeBox=$false; " ^ "$f.ClientSize=New-Object System.Drawing.Size(950,560); " ^ "$tb=New-Object System.Windows.Forms.TextBox; " ^ "$tb.Multiline=$true; $tb.ReadOnly=$true; $tb.ScrollBars='Both'; $tb.WordWrap=$false; " ^ "$tb.Font=New-Object System.Drawing.Font('Consolas',10); " ^ "$tb.Dock='Fill'; $tb.Text=$msg; " ^ "$buttons=New-Object System.Windows.Forms.FlowLayoutPanel; " ^ "$buttons.Dock='Bottom'; $buttons.Height=52; $buttons.FlowDirection='RightToLeft'; $buttons.Padding='10,10,10,10'; " ^ "$okBtn=New-Object System.Windows.Forms.Button; $okBtn.Text='OK'; $okBtn.Width=90; $okBtn.Height=30; " ^ "$okBtn.Add_Click({$f.Close()}); " ^ "$buttons.Controls.Add($okBtn); " ^ "$f.Controls.Add($tb); $f.Controls.Add($buttons); " ^ "$null=$f.ShowDialog();" if "%FAIL%"=="1" exit /b 2 exit /b 0