Files
riojoy/deploy/uninstall-rio.ps1
T
CydandClaude Opus 4.8 67b56559f7 Deploy: RIOJoy payload folder + pre-uninstall cleanup
Rename the package payload folder to RIOJoy (was riojoy) so it extracts
to C:\games\RIOJoy, and add a pre-uninstall path the console can run
before deleting the folder.

- pre-uninstall.bat (inside RIOJoy\): self-elevating entry point that
  runs uninstall-rio.ps1.
- uninstall-rio.ps1: stops the tray app, removes the HKLM Run entry,
  uninstalls ViGEmBus (-KeepDriver to skip), and clears per-user config
  for every profile (-KeepConfig to skip). Idempotent and non-fatal.
- build-package.ps1 bundles both; README documents the uninstall flow.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 10:31:08 -05:00

116 lines
4.6 KiB
PowerShell

<#
.SYNOPSIS
RIOJoy cockpit pre-uninstall cleanup. Reverses install-rio.ps1: stops the
running tray app, removes the logon entry, optionally uninstalls ViGEmBus,
and clears per-user config. Must run elevated (pre-uninstall.bat elevates
for you). Idempotent — safe to re-run, and safe to run when RIOJoy was never
fully installed.
.DESCRIPTION
Run from inside the deployed package directory (e.g. C:\games\RIOJoy) BEFORE
the console deletes the folder. Stopping the tray app releases the file locks
on app\RioJoy.Tray.exe so the folder can then be removed cleanly. This script
does NOT delete its own folder — the console does that after this returns.
.PARAMETER KeepDriver
Leave ViGEmBus installed (default is to uninstall it, since the RIOJoy package
installed it). Use this if other software on the machine relies on ViGEmBus.
.PARAMETER KeepConfig
Leave per-user config (%APPDATA%\RIOJoy) in place. Default removes it for every
user profile on the machine.
#>
param(
[switch]$KeepDriver,
[switch]$KeepConfig
)
$ErrorActionPreference = 'Stop'
$root = $PSScriptRoot
$vendorDir = Join-Path $root 'vendor'
$runValueName = 'RIOJoy'
# --- guard ----------------------------------------------------------------
$principal = [Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()
if (-not $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
throw 'uninstall-rio.ps1 must run elevated. Run pre-uninstall.bat (it elevates).'
}
Write-Host '== RIOJoy pre-uninstall cleanup ==' -ForegroundColor Cyan
# 1. Stop the running tray app (releases locks on app\RioJoy.Tray.exe).
$procs = Get-Process -Name 'RioJoy.Tray' -ErrorAction SilentlyContinue
if ($procs) {
Write-Host "Stopping RIOJoy ($($procs.Count) process(es))..."
$procs | Stop-Process -Force -ErrorAction SilentlyContinue
Start-Sleep -Milliseconds 500
} else {
Write-Host 'RIOJoy is not running.'
}
# 2. Remove the logon entry (machine-wide Run key).
$runKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
if (Get-ItemProperty -Path $runKey -Name $runValueName -ErrorAction SilentlyContinue) {
Write-Host 'Removing logon entry...'
Remove-ItemProperty -Path $runKey -Name $runValueName -Force -ErrorAction SilentlyContinue
} else {
Write-Host 'No logon entry present.'
}
# 3. Uninstall ViGEmBus (best-effort; non-fatal) unless told to keep it.
if ($KeepDriver) {
Write-Host 'Leaving ViGEmBus installed (-KeepDriver).'
} else {
$svc = Get-Service -Name ViGEmBus -ErrorAction SilentlyContinue
if ($svc) {
$installer = Get-ChildItem -Path $vendorDir -Filter 'ViGEmBus*.exe' -ErrorAction SilentlyContinue |
Select-Object -First 1
if ($installer) {
Write-Host "Uninstalling ViGEmBus ($($installer.Name))..."
try {
$p = Start-Process -FilePath $installer.FullName `
-ArgumentList '/uninstall', '/quiet', '/norestart' -Wait -PassThru
if ($p.ExitCode -notin 0, 3010) {
Write-Warning "ViGEmBus uninstall returned exit code $($p.ExitCode) (continuing)."
} else {
Write-Host 'ViGEmBus uninstalled.'
}
} catch {
Write-Warning "ViGEmBus uninstall failed (continuing): $($_.Exception.Message)"
}
} else {
Write-Warning "ViGEmBus is installed but its installer is not in $vendorDir — skipping driver removal."
}
} else {
Write-Host 'ViGEmBus is not installed.'
}
}
# 4. Remove per-user config for every profile (best-effort) unless told to keep it.
if ($KeepConfig) {
Write-Host 'Leaving per-user config (-KeepConfig).'
} else {
$usersRoot = Join-Path $env:SystemDrive 'Users'
$removed = 0
if (Test-Path $usersRoot) {
foreach ($profile in Get-ChildItem -Path $usersRoot -Directory -ErrorAction SilentlyContinue) {
$cfg = Join-Path $profile.FullName 'AppData\Roaming\RIOJoy'
if (Test-Path $cfg) {
try {
Remove-Item -Path $cfg -Recurse -Force -ErrorAction Stop
$removed++
} catch {
Write-Warning "Could not remove $cfg (continuing): $($_.Exception.Message)"
}
}
}
}
Write-Host "Removed per-user config from $removed profile(s)."
}
# --- summary --------------------------------------------------------------
Write-Host ''
Write-Host 'RIOJoy cleanup complete. The console may now delete the RIOJoy folder.' -ForegroundColor Green
exit 0