From ee4ac21a0f7b3f80c79895393e3bd6919b7268da Mon Sep 17 00:00:00 2001 From: Andrzej Demski <75534654+AndrewDemski-ad-gmail-com@users.noreply.github.com> Date: Mon, 1 Apr 2024 15:51:37 +0200 Subject: [PATCH] Update _Mods-Functions.ps1 Rewritten Uninstall-ModsApp function --- .../mods/_Mods-Functions.ps1 | 219 ++++++++---------- 1 file changed, 103 insertions(+), 116 deletions(-) diff --git a/Sources/WAU/Winget-AutoUpdate/mods/_Mods-Functions.ps1 b/Sources/WAU/Winget-AutoUpdate/mods/_Mods-Functions.ps1 index 4528848..7c098b1 100644 --- a/Sources/WAU/Winget-AutoUpdate/mods/_Mods-Functions.ps1 +++ b/Sources/WAU/Winget-AutoUpdate/mods/_Mods-Functions.ps1 @@ -53,126 +53,113 @@ function Uninstall-WingetID ($WingetIDUninst) { Return } -function Uninstall-ModsApp ($AppUninst, $AllVersions) { - foreach ($app in $AppUninst) { - $InstalledSoftware = Get-ChildItem "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall" - foreach ($obj in $InstalledSoftware) { - if ($obj.GetValue('DisplayName') -like $App) { - $UninstallString = $obj.GetValue('UninstallString') - $CleanedUninstallString = $UninstallString.Trim([char]0x0022) - if ($UninstallString -like "MsiExec.exe*") { - $ProductCode = Select-String "{.*}" -inputobject $UninstallString - $ProductCode = $ProductCode.matches.groups[0].value - #MSI x64 Installer - $Exec = Start-Process "C:\Windows\System32\msiexec.exe" -ArgumentList "/x$ProductCode REBOOT=R /qn" -PassThru -Wait - #Stop Hard Reboot (if bad MSI!) - if ($Exec.ExitCode -eq 1641) { - Start-Process "C:\Windows\System32\shutdown.exe" -ArgumentList "/a" - } - } - else { - $QuietUninstallString = $obj.GetValue('QuietUninstallString') - if ($QuietUninstallString) { - $QuietUninstallString = Select-String "(\x22.*\x22) +(.*)" -inputobject $QuietUninstallString - $Command = $QuietUninstallString.matches.groups[1].value - $Parameter = $QuietUninstallString.matches.groups[2].value - #All EXE x64 Installers (already defined silent uninstall) - Start-Process $Command -ArgumentList $Parameter -Wait - } - else { - if ((Test-Path $CleanedUninstallString)) { - $NullSoft = Select-String -Path $CleanedUninstallString -Pattern "Nullsoft" - } - if ($NullSoft) { - #NSIS x64 Installer - Start-Process $UninstallString -ArgumentList "/S" -Wait - } - else { - if ((Test-Path $CleanedUninstallString)) { - $Inno = Select-String -Path $CleanedUninstallString -Pattern "Inno Setup" - } - if ($Inno) { - #Inno x64 Installer - Start-Process $UninstallString -ArgumentList "/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-" -Wait - } - else { - Write-Host "x64 Uninstaller unknown, trying the UninstallString from registry..." - $NativeUninstallString = Select-String "(\x22.*\x22) +(.*)" -inputobject $UninstallString - $Command = $NativeUninstallString.matches.groups[1].value - $Parameter = $NativeUninstallString.matches.groups[2].value - #All EXE x64 Installers (native defined uninstall) - Start-Process $Command -ArgumentList $Parameter -Wait - } - } - } - } - $x64 = $true - if (!$AllVersions) { - break - } - } - } - if (!$x64) { - $InstalledSoftware = Get-ChildItem "HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall" - foreach ($obj in $InstalledSoftware) { - if ($obj.GetValue('DisplayName') -like $App) { - $UninstallString = $obj.GetValue('UninstallString') - $CleanedUninstallString = $UninstallString.Trim([char]0x0022) - if ($UninstallString -like "MsiExec.exe*") { - $ProductCode = Select-String "{.*}" -inputobject $UninstallString - $ProductCode = $ProductCode.matches.groups[0].value - #MSI x86 Installer - $Exec = Start-Process "C:\Windows\System32\msiexec.exe" -ArgumentList "/x$ProductCode REBOOT=R /qn" -PassThru -Wait - #Stop Hard Reboot (if bad MSI!) - if ($Exec.ExitCode -eq 1641) { - Start-Process "C:\Windows\System32\shutdown.exe" -ArgumentList "/a" - } - } - else { - $QuietUninstallString = $obj.GetValue('QuietUninstallString') - if ($QuietUninstallString) { - $QuietUninstallString = Select-String "(\x22.*\x22) +(.*)" -inputobject $QuietUninstallString - $Command = $QuietUninstallString.matches.groups[1].value - $Parameter = $QuietUninstallString.matches.groups[2].value - #All EXE x86 Installers (already defined silent uninstall) - Start-Process $Command -ArgumentList $Parameter -Wait - } - else { - if ((Test-Path $CleanedUninstallString)) { - $NullSoft = Select-String -Path $CleanedUninstallString -Pattern "Nullsoft" - } - if ($NullSoft) { - #NSIS x86 Installer - Start-Process $UninstallString -ArgumentList "/S" -Wait - } - else { - if ((Test-Path $CleanedUninstallString)) { - $Inno = Select-String -Path $CleanedUninstallString -Pattern "Inno Setup" - } - if ($Inno) { - #Inno x86 Installer - Start-Process $UninstallString -ArgumentList "/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-" -Wait - } - else { - Write-Host "x86 Uninstaller unknown, trying the UninstallString from registry..." - $NativeUninstallString = Select-String "(\x22.*\x22) +(.*)" -inputobject $UninstallString - $Command = $NativeUninstallString.matches.groups[1].value - $Parameter = $NativeUninstallString.matches.groups[2].value - #All EXE x86 Installers (native defined uninstall) - Start-Process $Command -ArgumentList $Parameter -Wait - } - } - } - } - if (!$AllVersions) { - break - } - } - } +function Uninstall-ModsApp ($AppUninst, $AllVersions) +{ + foreach ($app in $AppUninst) + { + # we start from scanning the x64 node in registry, if something was found, then we set x64=TRUE + [bool]$app_was_x64 = Process-installedSoftware -app $app -x64 $true; + + # if nothing was found in x64 node, then we repeat that action in x86 node + if (!$app_was_x64) + { + Process-installedSoftware -app $app | Out-Null; } } Return } + +Function Process-installedSoftware() +{ + [OutputType([Bool])] + Param( + [parameter(Mandatory=$true)] [string]$app, + [parameter(Mandatory=$false)][bool] $x64 = $false + ) + if($true -eq $x64) + { + [string]$path = "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall"; + } + else + { + [string]$path = "HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"; + } + + [bool]$app_was_found = $false; + [Microsoft.Win32.RegistryKey[]]$InstalledSoftware = Get-ChildItem $path; + foreach ($obj in $InstalledSoftware) + { + if ($obj.GetValue('DisplayName') -like $App) + { + $UninstallString = $obj.GetValue('UninstallString') + $CleanedUninstallString = $UninstallString.Trim([char]0x0022) + if ($UninstallString -like "MsiExec.exe*") + { + $ProductCode = Select-String "{.*}" -inputobject $UninstallString + $ProductCode = $ProductCode.matches.groups[0].value + #MSI x64 Installer + $Exec = Start-Process "C:\Windows\System32\msiexec.exe" -ArgumentList "/x$ProductCode REBOOT=R /qn" -PassThru -Wait + #Stop Hard Reboot (if bad MSI!) + if ($Exec.ExitCode -eq 1641) + { + Start-Process "C:\Windows\System32\shutdown.exe" -ArgumentList "/a" + } + } + else + { + $QuietUninstallString = $obj.GetValue('QuietUninstallString') + if ($QuietUninstallString) + { + $QuietUninstallString = Select-String "(\x22.*\x22) +(.*)" -inputobject $QuietUninstallString + $Command = $QuietUninstallString.matches.groups[1].value + $Parameter = $QuietUninstallString.matches.groups[2].value + #All EXE x64 Installers (already defined silent uninstall) + Start-Process $Command -ArgumentList $Parameter -Wait + } + else + { + if ((Test-Path $CleanedUninstallString)) + { + $NullSoft = Select-String -Path $CleanedUninstallString -Pattern "Nullsoft" + } + if ($NullSoft) + { + #NSIS x64 Installer + Start-Process $UninstallString -ArgumentList "/S" -Wait + } + else + { + if ((Test-Path $CleanedUninstallString)) + { + $Inno = Select-String -Path $CleanedUninstallString -Pattern "Inno Setup" + } + if ($Inno) + { + #Inno x64 Installer + Start-Process $UninstallString -ArgumentList "/VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-" -Wait + } + else + { + Write-Host "$(if($true -eq $x64) {'x64'} else {'x86'}) Uninstaller unknown, trying the UninstallString from registry..." + $NativeUninstallString = Select-String "(\x22.*\x22) +(.*)" -inputobject $UninstallString + $Command = $NativeUninstallString.matches.groups[1].value + $Parameter = $NativeUninstallString.matches.groups[2].value + #All EXE x64 Installers (native defined uninstall) + Start-Process $Command -ArgumentList $Parameter -Wait + } + } + } + } + $app_was_found = $true + if (!$AllVersions) + { + break + } + } + } + return $app_was_found; +} + function Remove-ModsLnk ($Lnk) { foreach ($link in $Lnk) { Remove-Item -Path "${env:Public}\Desktop\$link.lnk" -Force -ErrorAction SilentlyContinue | Out-Null