-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- refractor scans into one function - create Invoke-WinUtilInitializeModule Function & use it accordingly - refractor Update Installation process - refractor DataGrid Item-management through Itemsource for better Main Thread performance
- Loading branch information
1 parent
27a97e4
commit f8b7f62
Showing
9 changed files
with
280 additions
and
199 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
|
||
function Invoke-WinUtilUpdateInstall { | ||
|
||
<# | ||
.SYNOPSIS | ||
Installs Windows updates using the Initialize-WindowsUpdateModule and Install-WindowsUpdate cmdlets. | ||
.PARAMETER Params | ||
A hashtable containing the parameters for the Install-WindowsUpdate cmdlet. | ||
#> | ||
|
||
param ( | ||
[Parameter(Mandatory=$true)] | ||
[hashtable]$Params | ||
) | ||
|
||
try { | ||
Initialize-WindowsUpdateModule | ||
Install-WindowsUpdate @Params | ||
Set-WinUtilTaskbaritem -state "None" -overlay "checkmark" | ||
} | ||
catch { | ||
Write-Host "Error installing updates: $_" -ForegroundColor Red | ||
Set-WinUtilTaskbaritem -state "Error" -overlay "warning" | ||
} | ||
} | ||
|
||
function Invoke-WPFUpdateMGMT { | ||
|
||
<# | ||
.SYNOPSIS | ||
Manages Windows Update Installation | ||
.PARAMETER Selected | ||
A switch parameter that indicates whether to install only selected updates. | ||
.PARAMETER All | ||
A switch parameter that indicates whether to install all available updates. | ||
#> | ||
|
||
param ( | ||
[switch]$Selected, | ||
[switch]$All | ||
) | ||
|
||
# Prepare common installation parameters | ||
$params = @{ | ||
Confirm = $false | ||
IgnoreReboot = $true | ||
IgnoreRebootRequired = $true | ||
} | ||
|
||
if ($sync["WPFUpdateVerbose"].IsChecked) { | ||
$params['Verbose'] = $true | ||
} | ||
|
||
try { | ||
if ($All) { | ||
Set-WinUtilTaskbaritem -state "Indeterminate" -value 0.01 -overlay "logo" | ||
Invoke-WinUtilUpdateControls -state $false | ||
Invoke-WPFRunspace -ArgumentList $params -DebugPreference $DebugPreference -ScriptBlock { | ||
param ($params) | ||
|
||
try { | ||
Write-Host "Installing all available updates..." | ||
Invoke-WinUtilUpdateInstall -Params $params | ||
Write-Host "All available updates installed successfully" | ||
$sync.form.Dispatcher.Invoke([action] { Set-WinUtilTaskbaritem -state "None" -overlay "checkmark" }) | ||
} catch { | ||
Write-Host "Error installing updates: $_" -ForegroundColor Red | ||
$sync.form.Dispatcher.Invoke([action] { Set-WinUtilTaskbaritem -state "Error" -overlay "warning" }) | ||
} | ||
} | ||
Invoke-WinUtilUpdateControls -state $true | ||
} elseif ($Selected -and $sync["WPFUpdatesList"].SelectedItems.Count -gt 0) { | ||
Write-Host "Installing selected updates..." | ||
|
||
# Get selected updates | ||
$selectedUpdates = $sync["WPFUpdatesList"].SelectedItems | ForEach-Object { | ||
[PSCustomObject]@{ | ||
ComputerName = $_.ComputerName | ||
Title = $_.LongTitle | ||
KB = $_.KB | ||
} | ||
} | ||
|
||
# Install selected updates | ||
Invoke-WPFRunspace -ParameterList @(("selectedUpdates", $selectedUpdates),("params", $params)) -DebugPreference $DebugPreference -ScriptBlock { | ||
param ($selectedUpdates, $params) | ||
|
||
$sync.form.Dispatcher.Invoke([action] { | ||
Set-WinUtilTaskbaritem -state "Indeterminate" -value 0.01 -overlay "logo" | ||
Invoke-WinUtilUpdateControls -state $false | ||
}) | ||
|
||
foreach ($update in $selectedUpdates) { | ||
Write-Host "Installing update $($update.Title) on $($update.ComputerName)" | ||
|
||
# Prepare update-specific parameters | ||
$updateParams = $params.Clone() | ||
$updateParams['ComputerName'] = $update.ComputerName | ||
|
||
# Install update based on KB or Title | ||
if ($update.KB) { | ||
Get-WindowsUpdate -KBArticleID $update.KB -Install @updateParams | ||
} else { | ||
Get-WindowsUpdate -Title $update.Title -Install @updateParams | ||
} | ||
} | ||
|
||
$sync.form.Dispatcher.Invoke([action] { | ||
Set-WinUtilTaskbaritem -state "None" -overlay "checkmark" | ||
Invoke-WinUtilUpdateControls -state $true | ||
}) | ||
Write-Host "Selected updates installed successfully" | ||
} | ||
} else { | ||
Write-Host "No updates selected" | ||
} | ||
|
||
} catch { | ||
Write-Host "Error installing updates: $_" -ForegroundColor Red | ||
Set-WinUtilTaskbaritem -state "Error" -overlay "warning" | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,122 @@ | ||
function Invoke-WPFUpdateHistoryToggle { | ||
<# | ||
.SYNOPSIS | ||
Toggles the visibility of the Windows update history and available updates. | ||
#> | ||
|
||
$showHistory = $sync["WPFShowUpdateHistory"].Content -eq "Show History" | ||
|
||
$sync["WPFShowUpdateHistory"].Content = if ($showHistory) { "Show available Updates" } else { "Show History" } | ||
$sync["HistoryGrid"].Visibility = if ($showHistory) { "Visible" } else { "Collapsed" } | ||
$sync["UpdatesGrid"].Visibility = if ($showHistory) { "Collapsed" } else { "Visible" } | ||
} | ||
|
||
function Invoke-WinUtilUpdateControls { | ||
<# | ||
.SYNOPSIS | ||
Disables or enables the update controls based on the specified state. | ||
.PARAMETER state | ||
The state to set the controls to. | ||
#> | ||
|
||
param ( | ||
[boolean]$state | ||
) | ||
|
||
$sync["WPFScanUpdates"].IsEnabled = $state | ||
$sync["WPFUpdateScanHistory"].IsEnabled = $state | ||
$sync["WPFUpdateSelectedInstall"].IsEnabled = $state | ||
$sync["WPFUpdateAllInstall"].IsEnabled = $state | ||
} | ||
|
||
|
||
function Invoke-WPFUpdateScan { | ||
<# | ||
.SYNOPSIS | ||
Scans for Windows updates and history and builds the DataGrids for the UI. | ||
.PARAMETER type | ||
The type of scan to perform. | ||
#> | ||
|
||
param ( | ||
[string]$type | ||
) | ||
|
||
Set-WinUtilTaskbaritem -state "Indeterminate" -value 0.01 -overlay "logo" | ||
Invoke-WinUtilUpdateControls -state $false | ||
|
||
Invoke-WPFRunspace -ArgumentList $type -DebugPreference $DebugPreference -ScriptBlock { | ||
param ($type) | ||
try { | ||
Invoke-WinUtilInitializeModule -module "PSWindowsUpdate" | ||
switch ($type) { | ||
"updates" { | ||
$sync.form.Dispatcher.Invoke([action] { $sync["WPFUpdatesList"].ItemsSource = $null }) | ||
Write-Host "Scanning for Windows updates..." | ||
$updates = Get-WindowsUpdate -ErrorAction SilentlyContinue | ||
Write-Host "Found $($updates.Count) updates." | ||
|
||
# Build the list of items first | ||
$items = foreach ($update in $updates) { | ||
[PSCustomObject]@{ | ||
LongTitle = $update.Title | ||
ComputerName = $update.ComputerName | ||
KB = $update.KB | ||
Size = $update.Size | ||
Title = $update.Title -replace '\s*\(KB\d+\)', '' -replace '\s*KB\d+\b', '' | ||
Status = "Not Installed" | ||
} | ||
} | ||
|
||
$Computers = $updates.ComputerName | Select-Object -Unique | ||
|
||
# Update the DataGrid at once | ||
$sync.form.Dispatcher.Invoke([action] { | ||
$sync["WPFUpdatesList"].ItemsSource = $items | ||
$sync["WPFUpdatesList"].Columns[0].Visibility = if ($Computers.Count -gt 1) { "Visible" } else { "Collapsed" } | ||
}) | ||
} | ||
"history" { | ||
$sync.form.Dispatcher.Invoke([action] { $sync["WPFUpdateHistory"].ItemsSource = $null }) | ||
Write-Host "Scanning for Windows update history..." | ||
$history = Get-WUHistory -Last 50 -ErrorAction Stop | ||
if (!$history) { | ||
Write-Host "No update history available." | ||
return | ||
} | ||
|
||
# Build the list of history items first | ||
$items = foreach ($update in $history) { | ||
[PSCustomObject]@{ | ||
ComputerName = $update.ComputerName | ||
Result = $update.Result | ||
Title = $update.Title -replace '\s*\(KB\d+\)', '' -replace '\s*KB\d+\b', '' | ||
KB = $update.KB | ||
Date = $update.Date | ||
} | ||
} | ||
|
||
$Computers = $history.ComputerName | Select-Object -Unique | ||
|
||
# Update the DataGrid at once | ||
$sync.form.Dispatcher.Invoke([action] { | ||
$sync["WPFUpdateHistory"].ItemsSource = $items | ||
$sync["WPFUpdateHistory"].Columns[0].Visibility = if ($Computers.Count -gt 1) { "Visible" } else { "Collapsed" } | ||
}) | ||
Write-Host "Scanning for Windows update history completed" | ||
} | ||
} | ||
|
||
$sync.form.Dispatcher.Invoke([action] { Set-WinUtilTaskbaritem -state "None" -overlay "checkmark" }) | ||
} | ||
catch { | ||
$sync.form.Dispatcher.Invoke([action] { Set-WinUtilTaskbaritem -state "Error" -overlay "warning" }) | ||
Write-Host "Error during scan: $_" -ForegroundColor Red | ||
} finally { | ||
$sync.form.Dispatcher.Invoke([action] { Invoke-WinUtilUpdateControls -state $true }) | ||
} | ||
} | ||
} |
Oops, something went wrong.