winget, the Windows Package Manager, can update most of the desktop apps on your PC with one command. This guide shows how to list available updates, upgrade everything with winget upgrade --all, include apps with unknown versions, run upgrades silently, keep a specific app on its current version with winget pin, refresh sources, fix “winget is not recognized”, and schedule the job. It works on Windows 11 and on Windows 10 version 1809 or later.

Quick answer. Open Terminal and run winget upgrade to see what can be updated, then winget upgrade --all to update it all. Add --include-unknown to also try apps whose installed version winget cannot read, and --silent plus the two --accept flags to avoid prompts.

PowerShell: winget source update
Commands for this step: Quick answer
winget source update
winget upgrade
winget upgrade --all
winget upgrade --all --include-unknown --silent --accept-package-agreements --accept-source-agreements
winget pin add --id Mozilla.Firefox

What was verified and what was not. Every command and option here was checked against Microsoft Learn: the winget overview, the upgrade, pin and source command references, and the schtasks reference. The commands were not run for this guide, and package IDs such as Mozilla.Firefox are examples. Confirm the IDs and options on your own PC with winget upgrade --help.

Step 1: Check that winget is installed

winget ships as part of App Installer, a system component that the Microsoft Store keeps up to date on Windows 10 and 11. Open Windows Terminal, PowerShell or Command Prompt and run:

winget --version

If you get a version number, you are ready. If you get “not recognized”, jump to the Troubleshooting section.

Advertisement

Step 2: Refresh sources and see what can be updated

  1. Update the package sources so winget knows about the latest versions:
    winget source update
  2. List the apps that have an update available. Running upgrade with no arguments changes nothing:
    winget upgrade

Example output:

Name               Id                   Version   Available  Source
--------------------------------------------------------------------
Mozilla Firefox    Mozilla.Firefox      131.0     132.0      winget
7-Zip              7zip.7zip            23.01     24.08      winget
2 upgrades available.

The Id column is what you use in later commands. winget update is an alias of winget upgrade, so both work.

Step 3: Upgrade one app or all apps

  1. Upgrade a single app by its ID. -e (--exact) matches the ID exactly:
    winget upgrade --id 7zip.7zip -e
  2. Upgrade every app in the list:
    PowerShell: winget upgrade --all
    Commands for this step: Step 3: Upgrade one app or all apps
    winget upgrade --all

    -r and --recurse are aliases of --all.

  3. Include apps whose current version winget cannot determine:
    winget upgrade --all --include-unknown

    Microsoft notes that some apps do not report a version, so winget cannot tell whether a newer one exists. Without -u (--include-unknown), those apps are skipped. Because winget cannot compare versions for these apps, run this option when you have time to check the results.

Some apps, especially browsers and chat apps, must be closed before they can be updated. Close them first or the installer may fail or ask you to close them.

Step 4: Run upgrades without prompts

These options are useful for unattended runs and scripts:

Option What it does
-h, --silent Runs the installer in silent mode and hides its UI.
--accept-package-agreements Accepts package license agreements without a prompt.
--accept-source-agreements Accepts source agreements without a prompt.
--disable-interactivity Turns off winget’s own interactive prompts.
--include-pinned Also upgrades packages with a non-blocking pin.
--scope user or machine Limits the upgrade to per-user or machine-wide installs.
-o, --log Writes a log to the file you name.

A full unattended command looks like this:

winget upgrade --all --silent --accept-package-agreements --accept-source-agreements --disable-interactivity

Silent mode depends on each installer. A few installers still show a window or ask for input even with --silent.

Advertisement

Step 5: Run as administrator or not

Microsoft explains the difference this way. In a normal window, an app that needs elevation shows a UAC prompt during its install; if you decline, that app fails. In an Administrator window, you will not see those prompts and machine-wide apps update without stopping.

For a manual update, a normal window is fine; accept the UAC prompts as they appear. For a hands-off run, open Terminal as administrator (right-click Start, then Terminal (Admin)). Only do this when you trust the packages being installed.

Step 6: Exclude an app with winget pin

Sometimes you need to stay on a version, for example a tool your work depends on. winget has three kinds of pins:

  • Pinning (default): the app is skipped by winget upgrade --all but can still be upgraded by name.
  • Blocking: the app is not upgraded at all until you remove the pin, unless you use --force.
  • Gating: the app can only move within a version range, such as 1.2.*.
winget pin add --id Mozilla.Firefox            # skip in --all
winget pin add --id Mozilla.Firefox --blocking # block all upgrades
winget pin add --id Microsoft.PowerToys --version 0.70.*   # gate to 0.70.x
winget pin list
winget pin remove --id Mozilla.Firefox

A pin only controls winget. The app can still update itself through its own updater.

Stuck at this step? Ask us, it is free and include the exact error.

Step 7: Schedule winget upgrades

You can run the upgrade on a schedule with Task Scheduler. This creates a weekly task that runs on Sunday at 12:00 under your account. Run it from an elevated Command Prompt if you keep /rl HIGHEST:

PowerShell: schtasks /create /tn "winget weekly upgrade" /sc weekly /d SU
Commands for this step: Step 7: Schedule winget upgrades
schtasks /create /tn "winget weekly upgrade" /sc weekly /d SUN /st 12:00 /it /rl HIGHEST /tr "cmd /c winget upgrade --all --silent --accept-package-agreements --accept-source-agreements --disable-interactivity"

Notes before you rely on it:

  • The schtasks reference says that if /tr has no path, it assumes the program is in System32. That is why the command starts with cmd /c, which finds winget through your normal PATH.
  • /it runs the task only while your account is signed in. Microsoft notes that winget is registered for a user after that user signs in, so run the task under your own account, not SYSTEM.
  • /rl HIGHEST runs it with your highest privileges so machine-wide apps can update without UAC prompts. Leave it out to run with limited rights; apps that need elevation will then fail.
  • Test it once with schtasks /run /tn "winget weekly upgrade" and check that your apps updated.
  • Remove it later with schtasks /delete /tn "winget weekly upgrade".

Troubleshooting

“‘winget’ is not recognized as an internal or external command”

In PowerShell the message reads “The term ‘winget’ is not recognized as the name of a cmdlet”. Work through these fixes:

  1. Check your Windows version with winver. winget needs Windows 10 version 1809 (build 17763) or later.
  2. On a new PC or new user account, winget is registered in the background after the first sign-in. Microsoft gives this PowerShell command to request the registration:
    Add-AppxPackage -RegisterByFamilyName -MainPackage Microsoft.DesktopAppInstaller_8wekyb3d8bbwe
  3. Install or update App Installer from the Microsoft Store, then open a new terminal window.
  4. Windows Sandbox does not include winget or the Store. Microsoft documents installing the Microsoft.WinGet.Client module and running Repair-WinGetPackageManager there.

“No installed package found matching input criteria.”

The name or ID did not match. Run winget list to find the exact ID, then use --id with -e.

An app keeps appearing in the upgrade list

Some apps report a version that does not match the version in the winget repository, or update themselves outside winget. Upgrade it once with --id. If it still shows up, pin it or update it with its own updater.

Source errors or stale results

Run winget source update. If sources are broken, an elevated winget source reset --force restores the default sources (msstore, winget and winget-font) and removes any custom ones, so add those back afterwards.

Upgrade fails for one app

Close the app and try again. Add --verbose-logs and open the log folder with winget --logs to see the installer error. If a process will not close, see how to use taskkill. Network errors may need a check of your connection; see how to use ipconfig.

FAQ

Does winget upgrade –all update Microsoft Store apps?

winget includes the msstore source, so some Store apps can appear in the list. The Store also updates its own apps, so you may not see them often.

Does winget update Windows itself?

No. winget handles applications. Use Windows Update for the operating system and drivers.

Is –include-unknown safe?

It is a documented option, but winget cannot read the installed version of those apps, so it cannot tell whether you already have the latest one. Run it manually the first time and check the results before adding it to a scheduled task.

How do I stop a pinned app from blocking –all?

A default pin is simply skipped. Use winget upgrade --all --include-pinned to include it, or winget pin remove --id to delete the pin.

Related guides

Advertisement