Compile Winutil

This commit is contained in:
ChrisTitusTech 2024-05-11 21:07:21 +00:00 committed by github-actions[bot]
parent 0981509cfb
commit 2b0efd3eb3

View File

@ -427,17 +427,16 @@ Function Get-WinUtilCheckBoxes {
$group = if ($CheckBox.Key.StartsWith("WPFInstall")) { "Install" } $group = if ($CheckBox.Key.StartsWith("WPFInstall")) { "Install" }
elseif ($CheckBox.Key.StartsWith("WPFTweaks")) { "WPFTweaks" } elseif ($CheckBox.Key.StartsWith("WPFTweaks")) { "WPFTweaks" }
elseif ($CheckBox.Key.StartsWith("WPFFeature")) { "WPFFeature" } elseif ($CheckBox.Key.StartsWith("WPFFeature")) { "WPFFeature" }
if ($group) { if ($group) {
if ($CheckBox.Value.IsChecked -eq $true) { if ($CheckBox.Value.IsChecked -eq $true) {
$feature = switch ($group) { $feature = switch ($group) {
"Install" { "Install" {
$wingetValue = $sync.configs.applications.$($CheckBox.Name).winget # Get the winget value
if (-not [string]::IsNullOrWhiteSpace($wingetValue) -and $wingetValue -ne "na") { [PsCustomObject]@{
$wingetValue -split ";" winget="$($sync.configs.applications.$($CheckBox.Name).winget)";
} else { choco="$($sync.configs.applications.$($CheckBox.Name).choco)";
$sync.configs.applications.$($CheckBox.Name).choco
} }
} }
default { default {
$CheckBox.Name $CheckBox.Name
@ -461,8 +460,7 @@ Function Get-WinUtilCheckBoxes {
} }
} }
} }
return $Output
return $Output
} }
function Get-WinUtilInstallerProcess { function Get-WinUtilInstallerProcess {
<# <#
@ -723,95 +721,144 @@ function Install-WinUtilChoco {
} }
} }
function Install-WinUtilProgramChoco {
<#
.SYNOPSIS
Manages the provided programs using Chocolatey
.PARAMETER ProgramsToInstall
A list of programs to manage
.PARAMETER manage
The action to perform on the programs, can be either 'Installing' or 'Uninstalling'
.NOTES
The triple quotes are required any time you need a " in a normal script block.
#>
param(
$ProgramsToInstall,
$manage = "Installing"
)
$x = 0
$count = $ProgramsToInstall.Count
Write-Progress -Activity "$manage Applications" -Status "Starting" -PercentComplete 0
Write-Host "==========================================="
Write-Host "-- insstalling Chocolatey pacakages ---"
Write-Host "==========================================="
Foreach ($Program in $ProgramsToInstall){
Write-Progress -Activity "$manage Applications" -Status "$manage $($Program.choco) $($x + 1) of $count" -PercentComplete $($x/$count*100)
if($manage -eq "Installing"){
write-host "Starting install of $($Program.choco) with Chocolatey."
try{
$chocoStatus = $(Start-Process -FilePath "choco" -ArgumentList "install $($Program.choco) -y" -Wait -PassThru).ExitCode
if($chocoStatus -eq 0){
Write-Host "$($Program.choco) installed successfully using Chocolatey."
continue
} else {
Write-Host "Failed to install $($Program.choco) using Chocolatey."
}
Write-Host "Failed to install $($Program.choco)."
} catch {
Write-Host "Failed to install $($Program.choco) due to an error: $_"
}
}
if($manage -eq "Uninstalling"){
throw "not yet implemented";
}
$X++
}
Write-Progress -Activity "$manage Applications" -Status "Finished" -Completed
return;
}
Function Install-WinUtilProgramWinget { Function Install-WinUtilProgramWinget {
<# <#
.SYNOPSIS .SYNOPSIS
Manages the provided programs using Winget Manages the provided programs using Winget
.PARAMETER ProgramsToInstall .PARAMETER ProgramsToInstall
A list of programs to manage A list of programs to manage
.PARAMETER manage .PARAMETER manage
The action to perform on the programs, can be either 'Installing' or 'Uninstalling' The action to perform on the programs, can be either 'Installing' or 'Uninstalling'
.NOTES .NOTES
The triple quotes are required any time you need a " in a normal script block. The triple quotes are required any time you need a " in a normal script block.
#> #>
param( param(
$ProgramsToInstall, $ProgramsToInstall,
$manage = "Installing" $manage = "Installing"
) )
$x = 0 $x = 0
$count = $($ProgramsToInstall -split ",").Count $count = $ProgramsToInstall.Count
Write-Progress -Activity "$manage Applications" -Status "Starting" -PercentComplete 0 Write-Progress -Activity "$manage Applications" -Status "Starting" -PercentComplete 0
Write-Host "==========================================="
Foreach ($Program in $($ProgramsToInstall -split ",")){ Write-Host "-- installing winget packages ---"
Write-Host "==========================================="
Write-Progress -Activity "$manage Applications" -Status "$manage $Program $($x + 1) of $count" -PercentComplete $($x/$count*100) Foreach ($Program in $ProgramsToInstall){
$failedPackages = @()
Write-Progress -Activity "$manage Applications" -Status "$manage $($Program.winget) $($x + 1) of $count" -PercentComplete $($x/$count*100)
if($manage -eq "Installing"){ if($manage -eq "Installing"){
# Install package via ID, if it fails try again with different scope and then with an unelevated prompt. # Install package via ID, if it fails try again with different scope and then with an unelevated prompt.
# Since Install-WinGetPackage might not be directly available, we use winget install command as a workaround. # Since Install-WinGetPackage might not be directly available, we use winget install command as a workaround.
# Winget, not all installers honor any of the following: System-wide, User Installs, or Unelevated Prompt OR Silent Install Mode. # Winget, not all installers honor any of the following: System-wide, User Installs, or Unelevated Prompt OR Silent Install Mode.
# This is up to the individual package maintainers to enable these options. Aka. not as clean as Linux Package Managers. # This is up to the individual package maintainers to enable these options. Aka. not as clean as Linux Package Managers.
Write-Host "Starting install of $($Program.winget) with winget."
try { try {
$status = $(Start-Process -FilePath "winget" -ArgumentList "install --id $Program --silent --accept-source-agreements --accept-package-agreements" -Wait -PassThru).ExitCode $status = $(Start-Process -FilePath "winget" -ArgumentList "install --id $($Program.winget) --silent --accept-source-agreements --accept-package-agreements" -Wait -PassThru).ExitCode
if($status -eq 0){ if($status -eq 0){
Write-Host "$Program installed successfully." Write-Host "$($Program.winget) installed successfully."
continue continue
} }
Write-Host "Attempt with User scope" Write-Host "Attempt with User scope"
$status = $(Start-Process -FilePath "winget" -ArgumentList "install --id $Program --scope user --silent --accept-source-agreements --accept-package-agreements" -Wait -PassThru).ExitCode $status = $(Start-Process -FilePath "winget" -ArgumentList "install --id $($Program.winget) --scope user --silent --accept-source-agreements --accept-package-agreements" -Wait -PassThru).ExitCode
if($status -eq 0){ if($status -eq 0){
Write-Host "$Program installed successfully with User scope." Write-Host "$($Program.winget) installed successfully with User scope."
continue continue
} }
Write-Host "Attempt with User prompt" Write-Host "Attempt with User prompt"
$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) $userChoice = [System.Windows.MessageBox]::Show("Do you want to attempt $($Program.winget) installation with specific user credentials? Select 'Yes' to proceed or 'No' to skip.", "User Credential Prompt", [System.Windows.MessageBoxButton]::YesNo)
if ($userChoice -eq 'Yes') { if ($userChoice -eq 'Yes') {
$getcreds = Get-Credential $getcreds = Get-Credential
$process = Start-Process -FilePath "winget" -ArgumentList "install --id $Program --silent --accept-source-agreements --accept-package-agreements" -Credential $getcreds -PassThru $process = Start-Process -FilePath "winget" -ArgumentList "install --id $($Program.winget) --silent --accept-source-agreements --accept-package-agreements" -Credential $getcreds -PassThru
Wait-Process -Id $process.Id Wait-Process -Id $process.Id
$status = $process.ExitCode $status = $process.ExitCode
} else { } else {
Write-Host "Skipping installation with specific user credentials." Write-Host "Skipping installation with specific user credentials."
} }
if($status -eq 0){ if($status -eq 0){
Write-Host "$Program installed successfully with User prompt." Write-Host "$($Program.winget) installed successfully with User prompt."
continue continue
} }
Write-Host "Attempting installation with Chocolatey as a fallback method" } catch {
Install-WinUtilChoco Write-Host "Failed to install $($Program.winget). With winget"
$status = $(Start-Process -FilePath "choco" -ArgumentList "install $Program -y" -Wait -PassThru).ExitCode $failedPackages += $($Program.winget)
if($status -eq 0){ }
Write-Host "$Program installed successfully using Chocolatey."
continue
}
Write-Host "Failed to install $Program. You need to install it manually... Sorry!"
} catch {
Write-Host "Failed to install $Program due to an error: $_"
}
} }
if($manage -eq "Uninstalling"){ if($manage -eq "Uninstalling"){
# Uninstall package via ID using winget directly. # Uninstall package via ID using winget directly.
try { try {
$status = $(Start-Process -FilePath "winget" -ArgumentList "uninstall --id $Program --silent" -Wait -PassThru).ExitCode $status = $(Start-Process -FilePath "winget" -ArgumentList "uninstall --id $($Program.winget) --silent" -Wait -PassThru).ExitCode
if($status -ne 0){ if($status -ne 0){
Write-Host "Failed to uninstall $Program." Write-Host "Failed to uninstall $($Program.winget)."
} else { } else {
Write-Host "$Program uninstalled successfully." Write-Host "$($Program.winget) uninstalled successfully."
$failedPackages += $($Program.winget)
} }
} catch { } catch {
Write-Host "Failed to uninstall $Program due to an error: $_" Write-Host "Failed to uninstall $($Program.winget) due to an error: $_"
$failedPackages += $($Program.winget)
} }
} }
$X++ $X++
} }
Write-Progress -Activity "$manage Applications" -Status "Finished" -Completed Write-Progress -Activity "$manage Applications" -Status "Finished" -Completed
return $failedPackages;
} }
function Install-WinUtilWinget { function Install-WinUtilWinget {
<# <#
@ -3728,23 +3775,43 @@ function Invoke-WPFInstall {
return return
} }
$WingetInstall = (Get-WinUtilCheckBoxes)["Install"] $PackagesToInstall = (Get-WinUtilCheckBoxes)["Install"]
Write-Host $PackagesToInstall
if ($wingetinstall.Count -eq 0) { if ($PackagesToInstall.Count -eq 0) {
$WarningMsg = "Please select the program(s) to install or upgrade" $WarningMsg = "Please select the program(s) to install or upgrade"
[System.Windows.MessageBox]::Show($WarningMsg, $AppTitle, [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning) [System.Windows.MessageBox]::Show($WarningMsg, $AppTitle, [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return return
} }
Invoke-WPFRunspace -ArgumentList $WingetInstall -DebugPreference $DebugPreference -ScriptBlock { Invoke-WPFRunspace -ArgumentList $PackagesToInstall -DebugPreference $DebugPreference -ScriptBlock {
param($WingetInstall, $DebugPreference) param($PackagesToInstall, $DebugPreference)
$packagesWinget, $packagesChoco = {
$packagesWinget = [System.Collections.Generic.List`1[System.Object]]::new()
$packagesChoco = [System.Collections.Generic.List`1[System.Object]]::new()
foreach ($package in $PackagesToInstall) {
if ($package.winget -eq "na") {
$packagesChoco.add($package)
Write-Host "Queueing $($package.choco) for Chocolatey install"
} else {
$packagesWinget.add($package)
Write-Host "Queueing $($package.winget) for Winget install"
}
}
return $packagesWinget, $packagesChoco
}.Invoke($PackagesToInstall)
try{ try{
$sync.ProcessRunning = $true $sync.ProcessRunning = $true
$errorPackages = @()
Install-WinUtilWinget if($packagesWinget.Count -gt 0){
Install-WinUtilProgramWinget -ProgramsToInstall $WingetInstall Install-WinUtilWinget
$errorPackages += Install-WinUtilProgramWinget -ProgramsToInstall $packagesWinget
$errorPackages| ForEach-Object {if($_.choco -ne "na") {$packagesChoco += $_}}
}
if($packagesChoco.Count -gt 0){
Install-WinUtilChoco
Install-WinUtilProgramChoco -ProgramsToInstall $packagesChoco
}
Write-Host "===========================================" Write-Host "==========================================="
Write-Host "-- Installs have finished ---" Write-Host "-- Installs have finished ---"
Write-Host "===========================================" Write-Host "==========================================="
@ -4953,9 +5020,9 @@ function Invoke-WPFUnInstall {
return return
} }
$WingetInstall = (Get-WinUtilCheckBoxes)["Install"] $PackagesToInstall = (Get-WinUtilCheckBoxes)["Install"]
if ($wingetinstall.Count -eq 0) { if ($PackagesToInstall.Count -eq 0) {
$WarningMsg = "Please select the program(s) to install" $WarningMsg = "Please select the program(s) to install"
[System.Windows.MessageBox]::Show($WarningMsg, $AppTitle, [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning) [System.Windows.MessageBox]::Show($WarningMsg, $AppTitle, [System.Windows.MessageBoxButton]::OK, [System.Windows.MessageBoxImage]::Warning)
return return
@ -4963,21 +5030,39 @@ function Invoke-WPFUnInstall {
$ButtonType = [System.Windows.MessageBoxButton]::YesNo $ButtonType = [System.Windows.MessageBoxButton]::YesNo
$MessageboxTitle = "Are you sure?" $MessageboxTitle = "Are you sure?"
$Messageboxbody = ("This will uninstall the following applications: `n $WingetInstall") $Messageboxbody = ("This will uninstall the following applications: `n $($PackagesToInstall | Format-Table | Out-String)")
$MessageIcon = [System.Windows.MessageBoxImage]::Information $MessageIcon = [System.Windows.MessageBoxImage]::Information
$confirm = [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon) $confirm = [System.Windows.MessageBox]::Show($Messageboxbody, $MessageboxTitle, $ButtonType, $MessageIcon)
if($confirm -eq "No"){return} if($confirm -eq "No"){return}
Invoke-WPFRunspace -ArgumentList $WingetInstall -DebugPreference $DebugPreference -ScriptBlock { Invoke-WPFRunspace -ArgumentList $PackagesToInstall -DebugPreference $DebugPreference -ScriptBlock {
param($WingetInstall, $DebugPreference) param($PackagesToInstall, $DebugPreference)
$packagesWinget, $packagesChoco = {
$packagesWinget = [System.Collections.Generic.List`1[System.Object]]::new()
$packagesChoco = [System.Collections.Generic.List`1[System.Object]]::new()
foreach ($package in $PackagesToInstall) {
if ($package.winget -eq "na") {
$packagesChoco.add($package)
Write-Host "Queueing $($package.choco) for Chocolatey Uninstall"
} else {
$packagesWinget.add($package)
Write-Host "Queueing $($package.winget) for Winget Uninstall"
}
}
return $packagesWinget, $packagesChoco
}.Invoke($PackagesToInstall)
try{ try{
$sync.ProcessRunning = $true $sync.ProcessRunning = $true
# Install all selected programs in new window # Install all selected programs in new window
Install-WinUtilProgramWinget -ProgramsToInstall $WingetInstall -Manage "Uninstalling" if($packagesWinget.Count -gt 0){
Install-WinUtilProgramWinget -ProgramsToInstall $PackagesToInstall -Manage "Uninstalling"
}
if($packagesChoco.Count -gt 0){
Install-WinUtilProgramChoco -ProgramsToInstall $PackagesToInstall -Manage "Uninstalling"
}
$ButtonType = [System.Windows.MessageBoxButton]::OK $ButtonType = [System.Windows.MessageBoxButton]::OK
$MessageboxTitle = "Uninstalls are Finished " $MessageboxTitle = "Uninstalls are Finished "