If you've installed a dozen apps with winget, you don't want to update them one at a time. The good news: one command updates everything. Here's how winget upgrade --all actually works, plus the flags that turn it into a proper auto-updater.
TL;DR
winget upgrade --all --include-unknown --accept-package-agreements --accept-source-agreements
Open Terminal as Administrator and paste that. winget will compare every installed app against the catalog, download fresh installers, and silently update each one. Typical time: 2–10 minutes depending on how many apps and your bandwidth.
Step 1 — See what's outdated
Before updating, peek at what needs an upgrade:
winget upgrade
You'll get a table:
Name Id Version Available
---------------------------------------------------------------------------------
Microsoft Visual Studio Code Microsoft.VisualStudioCode 1.118.0 1.121.0
Google Chrome Google.Chrome 138.0.7204 139.0.7258
Git Git.Git 2.53.0 2.54.0
The Available column = newer version winget can install. If the column is empty, you're up to date.
Step 2 — Update everything in one command
winget upgrade --all
Add these flags to skip prompts (great for unattended runs):
winget upgrade --all --accept-package-agreements --accept-source-agreements
What happens:
- winget reads the catalog index
- For each installed app, compares your version vs latest
- Downloads the new installer from the publisher's URL (not Microsoft's CDN)
- Verifies SHA-256 hash
- Runs the installer silently
You'll see a progress bar per app. Failed ones get reported at the end so you can re-run or fix manually.
The --include-unknown flag (most useful flag people miss)
By default winget only upgrades apps it installed. If you installed Chrome via the website 6 months ago, winget knows Chrome is on your machine (via Add/Remove Programs) but won't upgrade it.
Add --include-unknown and winget will try to match those manually-installed apps to catalog manifests:
winget upgrade --all --include-unknown
This can take over and start managing 10–20 extra apps for you. The risk: occasionally winget guesses wrong and tries to upgrade with a different installer variant. If that happens, run winget uninstall <id> and reinstall via winget cleanly.
Step 3 — Exclude specific apps
Pinning prevents winget from auto-upgrading a specific app — useful for versions you've intentionally frozen (LTS Node, specific Python, legacy IDE):
winget pin add --id OpenJS.NodeJS.LTS
Now winget upgrade --all skips that ID. List pinned apps with:
winget pin list
Remove a pin:
winget pin remove --id OpenJS.NodeJS.LTS
Step 4 — Schedule weekly auto-updates
Open Task Scheduler (taskschd.msc) and create a Basic Task:
- Trigger: Weekly, Sunday 03:00
- Action: Start a program
- Program:
pwsh.exe(orpowershell.exe) - Arguments:
-NoProfile -Command "winget upgrade --all --include-unknown --accept-package-agreements --accept-source-agreements --silent --disable-interactivity"
- Run with highest privileges: ✅
- Wake the computer: off (let it pick up next time you're on)
Log output to a file:
-NoProfile -Command "winget upgrade --all --silent | Out-File C:\winget-update.log -Append"
Common errors and fixes
"No applicable update found"
You're already up to date. Re-run winget upgrade (no --all) — if the table is empty, all good.
"Installer hash does not match"
The publisher pushed a new installer but the winget manifest wasn't updated yet. Wait a day or use --force:
winget upgrade --id Some.App --force
Force-installing skips the hash check — only do this if you trust the publisher URL.
"Access denied" / "Administrator privileges required"
You ran in a non-elevated Terminal. Right-click Terminal → Run as administrator and try again.
"Multiple installer matches"
The app has both x64 and x86 installers and winget can't tell which you have. Specify architecture:
winget upgrade --id Some.App --architecture x64
Update keeps failing for one specific app
Some installers reject the silent flag winget sends. Uninstall and reinstall — winget will pick the correct flags from the latest manifest:
winget uninstall --id Bad.App
winget install --id Bad.App -e
How to know what changed
After updating, check what got bumped:
winget list --upgrade-available
(empty = nothing left to update)
Or check version history of a specific app:
winget show --id Microsoft.VisualStudioCode --versions
What's next?
- How to install Windows apps with winget → — beginner guide
- Winget commands cheatsheet → — every command in one page
- Set up a new Windows machine in 5 minutes → — winget import workflow
- Pre-made bundles → — Developer, Gaming, Office starter packs
