-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'main' of https://github.com/ChrisTitusTech/winutil
- Loading branch information
Showing
14 changed files
with
552 additions
and
612 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 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 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,171 @@ | ||
Function Invoke-WinUtilWingetProgram { | ||
<# | ||
.SYNOPSIS | ||
Runs the designated action on the provided programs using Winget | ||
.PARAMETER Programs | ||
A list of programs to process | ||
.PARAMETER action | ||
The action to perform on the programs, can be either 'Install' or 'Uninstall' | ||
.NOTES | ||
The triple quotes are required any time you need a " in a normal script block. | ||
The winget Return codes are documented here: https://github.com/microsoft/winget-cli/blob/master/doc/windows/package-actionr/winget/returnCodes.md | ||
#> | ||
|
||
param( | ||
[Parameter(Mandatory, Position=0)] | ||
$Programs, | ||
|
||
[Parameter(Mandatory, Position=1)] | ||
[ValidateSet("Install", "Uninstall")] | ||
[String]$Action | ||
) | ||
|
||
Function Invoke-Winget { | ||
<# | ||
.SYNOPSIS | ||
Invokes the winget.exe with the provided arguments and return the exit code | ||
.PARAMETER wingetId | ||
The Id of the Program that Winget should Install/Uninstall | ||
.PARAMETER scope | ||
Determines the installation mode. Can be "user" or "machine" (For more info look at the winget documentation) | ||
.PARAMETER credential | ||
The PSCredential Object of the user that should be used to run winget | ||
.NOTES | ||
Invoke Winget uses the public variable $Action defined outside the function to determine if a Program should be installed or removed | ||
#> | ||
param ( | ||
[string]$wingetId, | ||
[string]$scope = "", | ||
[PScredential]$credential = $null | ||
) | ||
|
||
$commonArguments = "--id $wingetId --silent" | ||
$arguments = if ($Action -eq "Install"){ | ||
"install $commonArguments --accept-source-agreements --accept-package-agreements $(if ($scope) {" --scope $scope"})" | ||
} | ||
else { | ||
"uninstall $commonArguments" | ||
} | ||
|
||
$processParams = @{ | ||
FilePath = "winget" | ||
ArgumentList = $arguments | ||
Wait = $true | ||
PassThru = $true | ||
NoNewWindow = $true | ||
} | ||
|
||
if ($credential) { | ||
$processParams.credential = $credential | ||
} | ||
|
||
return (Start-Process @processParams).ExitCode | ||
} | ||
|
||
Function Invoke-Install { | ||
<# | ||
.SYNOPSIS | ||
Contains the Install Logic and return code handling from winget | ||
.PARAMETER Program | ||
The Winget ID of the Program that should be installed | ||
#> | ||
param ( | ||
[string]$Program | ||
) | ||
$status = Invoke-Winget -wingetId $Program | ||
if ($status -eq 0) { | ||
Write-Host "$($Program) installed successfully." | ||
return $true | ||
} elseif ($status -eq -1978335189) { | ||
Write-Host "$($Program) No applicable update found" | ||
return $true | ||
} | ||
|
||
Write-Host "Attempt installation of $($Program) with User scope" | ||
$status = Invoke-Winget -wingetId $Program -scope "user" | ||
if ($status -eq 0) { | ||
Write-Host "$($Program) installed successfully with User scope." | ||
return $true | ||
} elseif ($status -eq -1978335189) { | ||
Write-Host "$($Program) No applicable update found" | ||
return $true | ||
} | ||
|
||
$userChoice = [System.Windows.MessageBox]::Show("Do you want to attempt $($Program) installation with specific user credentials? Select 'Yes' to proceed or 'No' to skip.", "User credential Prompt", [System.Windows.MessageBoxButton]::YesNo) | ||
if ($userChoice -eq 'Yes') { | ||
$getcreds = Get-Credential | ||
$status = Invoke-Winget -wingetId $Program -credential $getcreds | ||
if ($status -eq 0) { | ||
Write-Host "$($Program) installed successfully with User prompt." | ||
return $true | ||
} | ||
} else { | ||
Write-Host "Skipping installation with specific user credentials." | ||
} | ||
|
||
Write-Host "Failed to install $($Program)." | ||
return $false | ||
} | ||
|
||
Function Invoke-Uninstall { | ||
<# | ||
.SYNOPSIS | ||
Contains the Uninstall Logic and return code handling from winget | ||
.PARAMETER Program | ||
The Winget ID of the Program that should be uninstalled | ||
#> | ||
param ( | ||
[psobject]$Program | ||
) | ||
|
||
try { | ||
$status = Invoke-Winget -wingetId $Program | ||
if ($status -eq 0) { | ||
Write-Host "$($Program) uninstalled successfully." | ||
return $true | ||
} else { | ||
Write-Host "Failed to uninstall $($Program)." | ||
return $false | ||
} | ||
} catch { | ||
Write-Host "Failed to uninstall $($Program) due to an error: $_" | ||
return $false | ||
} | ||
} | ||
|
||
$count = $Programs.Count | ||
$failedPackages = @() | ||
|
||
Write-Host "===========================================" | ||
Write-Host "-- Configuring winget packages ---" | ||
Write-Host "===========================================" | ||
|
||
for ($i = 0; $i -lt $count; $i++) { | ||
$Program = $Programs[$i] | ||
$result = $false | ||
Set-WinUtilProgressBar -label "$Action $($Program)" -percent ($i / $count * 100) | ||
$sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -value ($i / $count)}) | ||
|
||
$result = switch ($Action) { | ||
"Install" {Invoke-Install -Program $Program} | ||
"Uninstall" {Invoke-Uninstall -Program $Program} | ||
default {throw "[Install-WinUtilProgramWinget] Invalid action: $Action"} | ||
} | ||
|
||
if (-not $result) { | ||
$failedPackages += $Program | ||
} | ||
} | ||
|
||
Set-WinUtilProgressBar -label "$($Action)ation done" -percent 100 | ||
return $failedPackages | ||
} |
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,31 @@ | ||
function Set-WinUtilProgressbar{ | ||
<# | ||
.SYNOPSIS | ||
This function is used to Update the Progress Bar displayed in the winutil GUI. | ||
It will be automatically hidden if the user clicks something and no process is running | ||
.PARAMETER Label | ||
The Text to be overlayed onto the Progress Bar | ||
.PARAMETER PERCENT | ||
The percentage of the Progress Bar that should be filled (0-100) | ||
.PARAMETER Hide | ||
If provided, the Progress Bar and the label will be hidden | ||
#> | ||
param( | ||
[string]$Label, | ||
[ValidateRange(0,100)] | ||
[int]$Percent, | ||
$Hide | ||
) | ||
if ($hide){ | ||
$sync.form.Dispatcher.Invoke([action]{$sync.ProgressBarLabel.Visibility = "Collapsed"}) | ||
$sync.form.Dispatcher.Invoke([action]{$sync.ProgressBar.Visibility = "Collapsed"}) | ||
} | ||
else{ | ||
$sync.form.Dispatcher.Invoke([action]{$sync.ProgressBarLabel.Visibility = "Visible"}) | ||
$sync.form.Dispatcher.Invoke([action]{$sync.ProgressBar.Visibility = "Visible"}) | ||
} | ||
$sync.form.Dispatcher.Invoke([action]{$sync.ProgressBarLabel.Content.Text = $label}) | ||
$sync.form.Dispatcher.Invoke([action]{$sync.ProgressBarLabel.Content.ToolTip = $label}) | ||
$sync.form.Dispatcher.Invoke([action]{ $sync.ProgressBar.Value = $percent}) | ||
|
||
} |
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
Oops, something went wrong.