Back to Powertoys

PowerToys Installer & Update Diagnostics

doc/devdocs/tools/installer-diagnostics.md

0.99.15.2 KB
Original Source

PowerToys Installer & Update Diagnostics

A step-by-step guide for diagnosing installer and update issues reported by users.

Quick Reference: Key Files

File/FolderPathContains
UpdateState.json%LOCALAPPDATA%\Microsoft\PowerToys\UpdateState.jsonPersisted update state machine
Runner logs%LOCALAPPDATA%\Microsoft\PowerToys\RunnerLogs\runner-log_*.logStartup, update checks, cleanup
Update logs%LOCALAPPDATA%\Microsoft\PowerToys\UpdateLogs\update-log_*.logPowerToys.Update.exe activity
Updates folder%LOCALAPPDATA%\Microsoft\PowerToys\Updates\Downloaded installer files

Note: These paths use %LOCALAPPDATA% (per-user AppData) regardless of whether PowerToys was installed per-user or per-machine. The data/settings location is always per-user.

Update State Values

From src/common/updating/updateState.h (UpdateState::State enum):

ValueNameMeaning
0upToDateNo update needed
1errorDownloadingDownload or install failed, will retry
2readyToDownloadNew version found, not yet downloaded
3readyToInstallInstaller downloaded, waiting for user action
4networkErrorGitHub API call failed

Symptom: Old update installers accumulating on disk

What to ask the user for

  1. Contents of UpdateState.json
  2. Runner logs (last few days from RunnerLogs\)
  3. Update logs (from UpdateLogs\, if they exist)
  4. List of files in Updates\ folder (names + sizes)

Step 1: Check the running version

In runner logs, look for the startup line:

[info] Scoobe: product_version=v0.XX.X last_version_run=v0.XX.X
  • If version < v0.73.0: The pre-download cleanup (PR #27908) is missing. Each downloaded installer accumulates because cleanup only runs at startup when state is upToDate. Ask the user to manually upgrade to the latest version.
  • If version >= v0.73.0: The pre-download cleanup exists. Accumulation should not happen under normal conditions. Continue to Step 2.

Step 2: Check UpdateState.json

jsonc
{"state": 3, "downloadedInstallerFilename": "powertoyssetup-0.98.1-x64.exe" /* additional fields may be present */}
  • state = 0 (upToDate): Cleanup should run at startup. If files are accumulating, check runner logs for "Failed to delete" warnings (Step 4).
  • state = 3 (readyToInstall): An installer is downloaded but never installed. Cleanup at startup is skipped (by design, to preserve the pending installer). On v0.73+, cleanup can still occur when a future update check triggers a new download (pre-download cleanup path).
  • state = 1 (errorDownloading): A previous download or install failed. Startup cleanup is skipped (state is not upToDate). On v0.73+, cleanup runs before the next installer download is attempted.
  • state = 2 or 4: Startup cleanup is skipped. On v0.73+, cleanup runs before the next installer download is attempted.

Step 3: Check if PowerToys.Update.exe has ever run

  • UpdateLogs directory missing: This suggests PowerToys.Update.exe may never have been launched, or it did not progress far enough to create logs. The user may never have triggered an install, or Stage 1 may have failed before Stage 2 could run.
  • UpdateLogs exist but show only "logger is initialized": The exe launched but the command-line argument didn't match any action (possible argument parsing issue).
  • UpdateLogs show install activity: The update process ran. Check for success/failure.

Step 4: Check runner logs for cleanup evidence

Search for these patterns:

Log patternMeaning
Failed to delete installer file ... Access is deniedFile locked by AV, another process, or permissions issue
Failed to delete log file ...Same, for old log files
Discovered new versionPeriodic update check ran
New version is already downloadedState is readyToInstall and filename matches — no re-download, no cleanup
No cleanup-related entries at allInconclusive by itself — cleanup_updates() is silent on success. Corroborate with the Updates folder contents (Step 5) and the running version (Step 1).

Step 5: Check the Updates folder contents

  • All different versions: Cleanup likely did not run across multiple update cycles. Confirm with the running version (Step 1) and update state before concluding a state gate issue.
  • Duplicate filenames: Unusual — would suggest repeated download without cleanup.
  • Single file matching downloadedInstallerFilename: Normal for readyToInstall state.

Common root causes

Root causeEvidenceFix
Running pre-v0.73.0 binaryproduct_version < v0.73.0 in runner logManually upgrade to latest
State stuck at readyToInstall (pre-v0.73)"state": 3 in UpdateState.json, no UpdateLogsManually upgrade to latest
File lock preventing deletion"Failed to delete ... Access is denied" in runner logsCheck AV software, reboot and retry
Update installer never launchedNo UpdateLogs directoryCheck if update notifications are disabled by GPO or setting
Install fails silentlyUpdateLogs show init but no install activityCheck related issues: #46966, #46967, #46969