# Attempts to locate Figma's uninstaller from registry and execute it silently $displayName = "Figma" $publisher = "Figma, Inc." $paths = @( 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall', 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', 'HKCU:\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 Figma processes before uninstalling Stop-Process -Name "Figma" -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 -s for silent $argumentList = @() if ($arguments -ne '') { # Split existing arguments and add them $argumentList += $arguments -split '\s+' } # Add -s for silent uninstall if not already present if ($argumentList -notcontains "-s" -and $argumentList -notcontains "--silent") { $argumentList += "-s" } Write-Host "Uninstall executable: $exePath" Write-Host "Uninstall arguments: $($argumentList -join ' ')" try { $processOptions = @{ FilePath = $exePath ArgumentList = $argumentList NoNewWindow = $true PassThru = $true Wait = $true } $process = Start-Process @processOptions $exitCode = $process.ExitCode Write-Host "Uninstall exit code: $exitCode" Exit $exitCode } catch { Write-Host "Error running uninstaller: $_" Exit 1 }