From d111244347f3f91c3744d7b4fc4b6c792060ab07 Mon Sep 17 00:00:00 2001 From: Marterich <47688561+Marterich@users.noreply.github.com> Date: Thu, 22 Aug 2024 21:59:16 +0200 Subject: [PATCH] Change Logging, Fix interactivity and optimize uninstall --- .../private/Install-WinUtilProgramChoco.ps1 | 90 ++++++++++--------- 1 file changed, 49 insertions(+), 41 deletions(-) diff --git a/functions/private/Install-WinUtilProgramChoco.ps1 b/functions/private/Install-WinUtilProgramChoco.ps1 index efd2e491..10f580ec 100644 --- a/functions/private/Install-WinUtilProgramChoco.ps1 +++ b/functions/private/Install-WinUtilProgramChoco.ps1 @@ -14,10 +14,10 @@ function Install-WinUtilProgramChoco { #> param( - [Parameter(Mandatory, Position=0)] + [Parameter(Mandatory, Position = 0)] [PsCustomObject]$ProgramsToInstall, - [Parameter(Position=1)] + [Parameter(Position = 1)] [String]$manage = "Installing" ) @@ -25,7 +25,7 @@ function Install-WinUtilProgramChoco { $count = $ProgramsToInstall.Count # This check isn't really necessary, as there's a couple of checks before this Private Function gets called, but just to make sure ;) - if($count -le 0) { + if ($count -le 0) { throw "Private Function 'Install-WinUtilProgramChoco' expected Parameter 'ProgramsToInstall' to be of size 1 or greater, instead got $count,`nPlease double check your code and re-compile WinUtil." } @@ -35,70 +35,78 @@ function Install-WinUtilProgramChoco { Write-Host "===========================================" Foreach ($Program in $ProgramsToInstall) { - if($manage -eq "Installing") { + if ($manage -eq "Installing") { write-host "Starting install of $($Program.choco) with Chocolatey." try { $tryUpgrade = $false - $installOutputFilePath = "$env:TEMP\Install-WinUtilProgramChoco.install-command.output.txt" - New-Item -ItemType File -Path $installOutputFilePath - $chocoInstallStatus = $(Start-Process -FilePath "choco" -ArgumentList "install $($Program.choco) -y" -Wait -PassThru -RedirectStandardOutput $installOutputFilePath -NoNewWindow).ExitCode - if(($chocoInstallStatus -eq 0) -AND (Test-Path -Path $installOutputFilePath)) { - $keywordsFound = Get-Content -Path $installOutputFilePath | Where-Object {$_ -match "reinstall" -OR $_ -match "already installed"} - if ($keywordsFound) { - $tryUpgrade = $true + $installOutputFilePath = "$env:TEMP\Install-WinUtilProgramChoco.install-command.output.txt" + New-Item -ItemType File -Path $installOutputFilePath + $chocoInstallStatus = $(Start-Process -FilePath "choco" -ArgumentList "install $($Program.choco) -y --log-file $($installOutputFilePath)" -Wait -PassThru).ExitCode + if (($chocoInstallStatus -eq 0) -AND (Test-Path -Path $installOutputFilePath)) { + $keywordsFound = Get-Content -Path $installOutputFilePath | Where-Object { $_ -match "reinstall" -OR $_ -match "already installed" } + if ($keywordsFound) { + $tryUpgrade = $true + } } - } - # TODO: Implement the Upgrade part using 'choco upgrade' command, this will make choco consistent with WinGet, as WinGet tries to Upgrade when you use the install command. - if ($tryUpgrade) { - $chocoUpdateStatus = $(Start-Process -FilePath "choco" -ArgumentList "upgrade $($Program.choco) -y" -Wait -PassThru -RedirectStandardOutput $installOutputFilePath -NoNewWindow).ExitCode - if ($chocoUpdateStatus -eq 0) { - Write-Host "$($Program.choco) was updated successfully using Chocolatey." - } - } - if(($chocoInstallStatus -eq 0) -AND ($tryUpgrade -eq $false)) { + if ($tryUpgrade) { + $chocoUpdateStatus = $(Start-Process -FilePath "choco" -ArgumentList "upgrade $($Program.choco) -y" -Wait -PassThru).ExitCode + if ($chocoUpdateStatus -eq 0) { + Write-Host "$($Program.choco) was updated successfully using Chocolatey." + } + else{ + Write-Host "Failed upgdate of $($Program.choco) using Chocolatey." + } + } + if (($chocoInstallStatus -eq 0) -AND ($tryUpgrade -eq $false)) { Write-Host "$($Program.choco) installed successfully using Chocolatey." $X++ - $sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Normal" -value ($x/$count) }) + $sync.form.Dispatcher.Invoke([action] { Set-WinUtilTaskbaritem -state "Normal" -value ($x / $count) }) continue - } else { - Write-Host "Failed to install $($Program.choco) using Chocolatey, Chocolatey output:`n`n$(Get-Content -Path $installOutputFilePath)." - $X++ - $sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Error" -value ($x/$count) }) } - } catch { + elseif (($chocoInstallStatus -ne 0) -AND ($tryUpgrade -eq $false)) { + Write-Host "Failed to install $($Program.choco) using Chocolatey" + $X++ + $sync.form.Dispatcher.Invoke([action] { Set-WinUtilTaskbaritem -state "Error" -value ($x / $count) }) + } + } + catch { Write-Host "Failed to install $($Program.choco) due to an error: $_" $X++ - $sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Error" -value ($x/$count) }) + $sync.form.Dispatcher.Invoke([action] { Set-WinUtilTaskbaritem -state "Error" -value ($x / $count) }) } } - if($manage -eq "Uninstalling") { - write-host "Starting uninstall of $($Program.choco) with Chocolatey." + if ($manage -eq "Uninstalling") { + Write-Host "Searching for Metapackages of of $($Program.choco) (.install or .portable)" + $chocoPackages = ((choco list | Select-String -Pattern "$($Program.choco)(\.install|\.portable){0,1}").Matches.Value) -join " " + Write-Host "Starting uninstall of $chocoPackages with Chocolatey." try { - $uninstallOutputFilePath = "$env:TEMP\Install-WinUtilProgramChoco.uninstall-command.output.txt" - New-Item -ItemType File -Path $uninstallOutputFilePath - $chocoUninstallStatus = $(Start-Process -FilePath "choco" -ArgumentList "uninstall $($Program.choco) -y" -Wait -PassThru -NoNewWindow).ExitCode - if($chocoUninstallStatus -eq 0) { + $uninstallOutputFilePath = "$env:TEMP\Install-WinUtilProgramChoco.uninstall-command.output.txt" + New-Item -ItemType File -Path $uninstallOutputFilePath + $chocoUninstallStatus = $(Start-Process -FilePath "choco" -ArgumentList "uninstall $chocoPackages -y" -Wait -PassThru).ExitCode + if ($chocoUninstallStatus -eq 0) { Write-Host "$($Program.choco) uninstalled successfully using Chocolatey." $x++ - $sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Normal" -value ($x/$count) }) + $sync.form.Dispatcher.Invoke([action] { Set-WinUtilTaskbaritem -state "Normal" -value ($x / $count) }) continue - } else { + } + else { Write-Host "Failed to uninstall $($Program.choco) using Chocolatey, Chocolatey output:`n`n$(Get-Content -Path $uninstallOutputFilePath)." $x++ - $sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Error" -value ($x/$count) }) + $sync.form.Dispatcher.Invoke([action] { Set-WinUtilTaskbaritem -state "Error" -value ($x / $count) }) } - } catch { + } + catch { Write-Host "Failed to uninstall $($Program.choco) due to an error: $_" $x++ - $sync.form.Dispatcher.Invoke([action]{ Set-WinUtilTaskbaritem -state "Error" -value ($x/$count) }) + $sync.form.Dispatcher.Invoke([action] { Set-WinUtilTaskbaritem -state "Error" -value ($x / $count) }) } - } + } } # Cleanup leftovers files - if(Test-Path -Path $installOutputFilePath) { Remove-Item -Path $installOutputFilePath } - if(Test-Path -Path $uninstallOutputFilePath) { Remove-Item -Path $uninstallOutputFilePath } + if (Test-Path -Path $installOutputFilePath) { Remove-Item -Path $installOutputFilePath } + if (Test-Path -Path $uninstallOutputFilePath) { Remove-Item -Path $uninstallOutputFilePath } return; }