Uninstall Software in Bulk With Winget and a Simple Script
Removing bloat from one PC is a chore. Removing the same twelve apps from every PC by hand is a project - unless winget does the removing.
✍️ Technical Anshu🪟 Windows⏱️ 6 minute read
🎥 Watch all three methods side by side in the full video
Winget installs in bulk happily, and it uninstalls too - one package per command. There is no single 'remove everything' switch, and honestly there should not be: a careless bulk removal can take something the office needs. The safe pattern is a named list and a small loop - you choose exactly which apps go, and the script repeats the command for each. Here is the manual command, then the script, then the limits.
Example output. Notice it works by exact ID, exactly like install - names are for humans, IDs are for scripts.
Uninstall reporting is per app - a script should keep the window open so you can read every result
1
Uninstall One App Cleanly
Find the exact ID with winget list - it shows installed apps with IDs and versions
Remove one app: winget uninstall --id VideoLAN.VLC --exact --silent
--silent asks the app's own uninstaller to run quietly; some uninstallers still show a window, because removal UI belongs to the publisher, not winget
Run winget list again to confirm the app is actually gone before moving on
2
The Bulk Script - a List and a Loop ⭐
Put the IDs you want removed into a plain text file, one per line, then let PowerShell do the repetition:
Create remove.txt with one package ID per line - nothing else
Create remove.ps1 with this line: Get-Content .\remove.txt | ForEach-Object { winget uninstall --id $_ --exact --silent --accept-source-agreements }
Run PowerShell as administrator from the folder holding both files and run .\remove.ps1
Read the results app by app when it finishes - the loop continues past a failure instead of stopping, which is what you want, as long as you check the summary
3
What Winget Cannot Remove - and the Safe Order
Windows components and protected system packages do not uninstall through winget - that boundary is intentional
Some apps leave their uninstaller broken after years of updates; those need the publisher's cleanup tool or a manual fix, not a bigger script
Always test the list on one PC first, and remove in a sensible order - the app itself before its runtimes and shared components
On office PCs, prefer doing bulk removal through your deployment tool's uninstall configuration, so the removal is reported centrally like installs are
⚠️ Honest warning: a bulk uninstall script has no undo. Export the machine's app list first with winget export so anything removed by mistake can be reinstalled in one command, and never put an ID in the list unless you have seen it on a real machine's winget list.
🎥 Watch the Full Comparison
The video's cleanup segment shows a bloat list being removed end to end - including the one app whose uninstaller insisted on showing a window anyway.
No, and that is deliberate - removing literally everything winget can see would break the PC. Bulk removal is done with a list of specific IDs and a loop, which keeps a human decision in the process.
Why did an app come back after I uninstalled it?
Usually because something reinstalled it - a suite updater, a Windows feature restore, or the app's main program reinstalling its companion. Uninstall the parent product as well, and check for its entry in winget list afterwards.
Can I use the same script on many office PCs?
Yes - the text file plus script travels well. For anything beyond a handful of PCs, run it through your deployment system instead, so you get a per-PC report of what was removed.
This guide is based on the Technical Anshu video on automatic software installation • Stuck on a step? Ask in the video comments and you will get a reply 🙏