mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-06-14 00:11:08 -05:00
Step-by-step guide for diagnosing old update installer accumulation, covering log files to check, UpdateState.json interpretation, and common root causes. <!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? --> ## Summary of the Pull Request <!-- Please review the items on the PR checklist before submitting--> ## PR Checklist - [ ] Closes: #xxx <!-- - [ ] Closes: #yyy (add separate lines for additional resolved issues) --> - [ ] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected - [ ] **Tests:** Added/updated and all pass - [ ] **Localization:** All end-user-facing strings can be localized - [ ] **Dev docs:** Added/updated - [ ] **New binaries:** Added on the required places - [ ] [JSON for signing](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ESRPSigning_core.json) for new binaries - [ ] [WXS for installer](https://github.com/microsoft/PowerToys/blob/main/installer/PowerToysSetup/Product.wxs) for new binaries and localization folder - [ ] [YML for CI pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/ci/templates/build-powertoys-steps.yml) for new test projects - [ ] [YML for signed pipeline](https://github.com/microsoft/PowerToys/blob/main/.pipelines/release.yml) - [ ] **Documentation updated:** If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/windows-uwp/tree/docs/hub/powertoys) and link it here: #xxx <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed
5.2 KiB
5.2 KiB
PowerToys Installer & Update Diagnostics
A step-by-step guide for diagnosing installer and update issues reported by users.
Quick Reference: Key Files
| File/Folder | Path | Contains |
|---|---|---|
| UpdateState.json | %LOCALAPPDATA%\Microsoft\PowerToys\UpdateState.json |
Persisted update state machine |
| Runner logs | %LOCALAPPDATA%\Microsoft\PowerToys\RunnerLogs\runner-log_*.log |
Startup, update checks, cleanup |
| Update logs | %LOCALAPPDATA%\Microsoft\PowerToys\UpdateLogs\update-log_*.log |
PowerToys.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):
| Value | Name | Meaning |
|---|---|---|
| 0 | upToDate | No update needed |
| 1 | errorDownloading | Download or install failed, will retry |
| 2 | readyToDownload | New version found, not yet downloaded |
| 3 | readyToInstall | Installer downloaded, waiting for user action |
| 4 | networkError | GitHub API call failed |
Symptom: Old update installers accumulating on disk
What to ask the user for
- Contents of
UpdateState.json - Runner logs (last few days from
RunnerLogs\) - Update logs (from
UpdateLogs\, if they exist) - 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
{"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.exemay 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 pattern | Meaning |
|---|---|
Failed to delete installer file ... Access is denied |
File locked by AV, another process, or permissions issue |
Failed to delete log file ... |
Same, for old log files |
Discovered new version |
Periodic update check ran |
New version is already downloaded |
State is readyToInstall and filename matches — no re-download, no cleanup |
| No cleanup-related entries at all | Inconclusive 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 forreadyToInstallstate.
Common root causes
| Root cause | Evidence | Fix |
|---|---|---|
| Running pre-v0.73.0 binary | product_version < v0.73.0 in runner log |
Manually upgrade to latest |
State stuck at readyToInstall (pre-v0.73) |
"state": 3 in UpdateState.json, no UpdateLogs |
Manually upgrade to latest |
| File lock preventing deletion | "Failed to delete ... Access is denied" in runner logs | Check AV software, reboot and retry |
| Update installer never launched | No UpdateLogs directory | Check if update notifications are disabled by GPO or setting |
| Install fails silently | UpdateLogs show init but no install activity | Check related issues: #46966, #46967, #46969 |