mirror of
https://github.com/ChrisTitusTech/winutil.git
synced 2025-06-28 09:04:47 -05:00
Choco Logic Refactor and Add Checkbox to prefer Chocolatey over Winget (#2596)
* First Selector and Logic * Extend Functionality * Switch to PreferChocolatey Checkbox * Persist Choco Preference across program restarts * Change Logging, Fix interactivity and optimize uninstall * Implement "Get-Installed" (quick-and-dirty) * Code Formatting * Rename File/Function, Refactor Choco Install, Add Status Indicator * Add documentation --------- Co-authored-by: Chris Titus <contact@christitus.com>
This commit is contained in:
169
functions/private/Install-WinUtilProgramWinget.ps1
Normal file
169
functions/private/Install-WinUtilProgramWinget.ps1
Normal file
@ -0,0 +1,169 @@
|
||||
Function Install-WinUtilProgramWinget {
|
||||
<#
|
||||
.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
|
||||
}
|
Reference in New Issue
Block a user