mirror of
https://github.com/ChrisTitusTech/winutil.git
synced 2024-11-24 11:55:31 +00:00
14d20cd161
* 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>
170 lines
5.4 KiB
PowerShell
170 lines
5.4 KiB
PowerShell
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
|
|
}
|