When winget install fails, the error message often ends with "Installer failed with exit code: 1603" or similar. That's not winget's code — it's the MSI installer's. Here's every common MSI exit code, what it means, and how to fix it.
Quick reference table
| Code | Meaning | What to do |
|---|---|---|
| 0 | Success | — |
| 1602 | User cancelled | Re-run, click through prompts |
| 1603 | Fatal error during install | See detailed section |
| 1605 | Action only valid for installed products | Try uninstall first |
| 1612 | Installation source unavailable | Re-download / network issue |
| 1618 | Another install in progress | See fix |
| 1619 | Package could not be opened | Corrupted download |
| 1620 | Package could not be opened (path) | Bad path |
| 1622 | Error opening log file | Pick writable log path |
| 1623 | Language not supported | Install English version |
| 1624 | Error applying transform | Bad MST file |
| 1625 | Disallowed by policy | Group Policy blocking |
| 1626 | Function failed during execution | Generic — retry |
| 1627 | Function failed during initialisation | Reinstall MSI engine |
| 1628 | Invalid table | Corrupted MSI |
| 1629 | Wrong data type | Bad MSI |
| 1630 | Wrong data | Bad MSI |
| 1631 | Service failed to start | Restart msiserver |
| 1633 | Not supported on this platform | OS mismatch |
| 1638 | Different version already installed | See detailed section |
| 1639 | Invalid command line | Check installer args |
| 1640 | Cannot install from terminal services | Use direct console |
| 1641 | Reboot required | Success — reboot |
| 1642 | Patch package not applicable | Wrong patch for installed version |
| 1643 | Patch removal not supported | Manual rollback |
| 1644 | One or more customisations not applicable | Bad transform |
| 1645 | Patch package not signed | Cert chain issue |
| 1646 | Patch removed | Success after rollback |
| 1648 | No valid patch sequence | Patch ordering issue |
| 1649 | Patch removal disallowed | Vendor restriction |
| 1650 | XML patch data invalid | Bad XML |
| 1651 | Admin patch upgrade error | Network share issue |
| 1652 | Operation failed | Generic |
| 1653 | UI is paused | Click through prompts |
| 1654 | Setup quit | User abort mid-setup |
| 3010 | Reboot required | Success — reboot |
| 3011 | Reboot initiated | Success — reboot |
The five you'll actually encounter
1603 — Fatal error during installation
The catch-all "something went wrong." Could be a hundred different causes. Diagnose:
- Re-run with verbose log:
winget install --id <ID> --log "$env:TEMP\winget.log" --verbose
Open winget.log and search for Error near the bottom.
- Common 1603 root causes:
- Antivirus blocking installer extraction
- Missing prerequisite (e.g. .NET version, VC++ runtime)
- Insufficient disk space (check
Get-PSDrive C) - Permission issue on TEMP folder
- Conflicting product already installed
- Quick fixes to try:
# Clear TEMP
Remove-Item "$env:TEMP\*" -Recurse -Force -ErrorAction SilentlyContinue
# Repair Windows Installer
sfc /scannow
DISM /Online /Cleanup-Image /RestoreHealth
# Restart Installer service
Restart-Service msiserver
Then retry winget.
1618 — Another installation in progress
MSI lock contention. See Another installation in progress fix.
TL;DR: wait 2 min, kill stuck msiexec.exe, or reboot.
1638 — Different version is already installed
You're trying to install version X, but version Y is on the machine. The MSI refuses to "downgrade" or "side-install":
Option A — uninstall first, then install:
winget uninstall --id <ID>
winget install --id <ID>
Option B — use --force to override (works for some apps):
winget install --id <ID> --force
Option C — upgrade instead of install (if X > Y):
winget upgrade --id <ID>
3010 / 1641 — Reboot required (success!)
These aren't errors despite the non-zero code. The install completed but Windows wants a restart to finalise (file replacement locked, kernel-mode driver, etc.).
shutdown /r /t 0
After reboot, the install is done.
To suppress reboot prompts in scripts:
winget install --id <ID> --override "/norestart"
The app will finish installing on next reboot.
1625 — Disallowed by policy
Group Policy is blocking the install. Common on corporate machines.
gpresult /h "$env:TEMP\gpo.html"
start "$env:TEMP\gpo.html"
Look for Windows Components → Windows Installer → Disable Windows Installer. If enabled, only IT can change it.
Workaround for personal apps: install per-user (--scope user) — this bypasses some machine-level policies.
How winget reports MSI codes
winget displays the code at the end of the install attempt:
Installing...
████████████████████ 100%
Installer failed with exit code: 1603
The number is the MSI's return value. winget itself returns its own exit code (which may differ — e.g. winget exits 0x8A150029 when an installer fails with 1603).
Reading verbose logs
When stuck, the log file is your friend:
winget install --id <ID> --log "$env:TEMP\winget.log" --verbose
Open and search for:
MSI (s)— installer-side messagesMSI (c)— client-side messagesError— actual errorsAction ended— what was running when it failed
Often the line right before "Error" tells you exactly what step failed.
Common 1603 root causes (in priority order)
- Missing .NET runtime — install required version first
- Antivirus interference — disable briefly, retry
- Stale .NET install cache —
dism /online /cleanup-image /restorehealth - Permission on
%TEMP%or%LOCALAPPDATA%\Temp—icacls $env:TEMP /reset - Disk space — need at least 2× installer size in TEMP + final location
- Conflicting old version — uninstall first
- MSI engine itself broken —
msiexec /unregister && msiexec /regserver
If verbose logs don't help, try installing manually (download installer, run directly). Same error confirms it's not a winget issue; different behaviour means winget's calling pattern is the culprit.
What's next?
- All winget error codes explained → — full HRESULT reference
- Installer hash does not match → — verify download integrity
- Access denied 0x80070005 → — permission fixes
- Another installation in progress → — 1618 specifically
