# Attempts to locate Spotify's uninstaller from registry and execute it silently $displayName = "Spotify" $publisher = "Spotify AB" # Spotify is user-scope, so check HKCU first, then HKLM as fallback $paths = @( 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', 'HKCU:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall', 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall' ) $uninstall = $null foreach ($p in $paths) { $items = Get-ItemProperty "$p\*" -ErrorAction SilentlyContinue | Where-Object { $_.DisplayName -and ($_.DisplayName -eq $displayName -or $_.DisplayName -like "$displayName*") -and ($publisher -eq "" -or $_.Publisher -eq $publisher) } if ($items) { $uninstall = $items | Select-Object -First 1; break } } if (-not $uninstall -or -not $uninstall.UninstallString) { Write-Host "Uninstall entry not found" Exit 0 } # Kill any running Spotify processes before uninstalling Stop-Process -Name "Spotify" -Force -ErrorAction SilentlyContinue Stop-Process -Name "SpotifyWebHelper" -Force -ErrorAction SilentlyContinue $uninstallString = $uninstall.UninstallString $exePath = "" $arguments = "" # Parse the uninstall string to extract executable path and existing arguments # Handles both quoted and unquoted paths if ($uninstallString -match '^"([^"]+)"(.*)') { $exePath = $matches[1] $arguments = $matches[2].Trim() } elseif ($uninstallString -match '^([^\s]+)(.*)') { $exePath = $matches[1] $arguments = $matches[2].Trim() } else { Write-Host "Error: Could not parse uninstall string: $uninstallString" Exit 1 } # Build argument list array, preserving existing arguments and adding /silent for silent $argumentList = @() if ($arguments -ne '') { # Split existing arguments and add them $argumentList += $arguments -split '\s+' } # Append /silent if not already present if ($argumentList -notcontains "/silent" -and $arguments -notmatch '\b/silent\b') { $argumentList += "/silent" } Write-Host "Uninstall executable: $exePath" Write-Host "Uninstall arguments: $($argumentList -join ' ')" try { $processOptions = @{ FilePath = $exePath NoNewWindow = $true PassThru = $true Wait = $true } if ($argumentList.Count -gt 0) { $processOptions.ArgumentList = $argumentList } $process = Start-Process @processOptions $exitCode = $process.ExitCode Write-Host "Uninstall exit code: $exitCode" Exit $exitCode } catch { Write-Host "Error running uninstaller: $_" Exit 1 }