Most operating systems come with some preinstalled software that you never use. These unwanted applications are often difficult to remove or uninstall through the regular interface. In this guide, we'll learn about removing bloatware applications from Windows. We'll use PowerShell commands for the same. It entirely depends on your personal preference what you call bloatware. So feel free to curate your personalized list of bloatware applications you want to remove from your Windows PC. The method explained works well on Windows 10 and 11. So, let's get started and remove bloat from our PC!
If you are technically challenged and never prefer a command-line environment, I won't recommend using this method. In that case, you can search for dedicated 3rd-party GUI tools to remove bloatware.
Before using the removal commands given below, be sure that you want to uninstall the application in question. It's time to free our Windows PC from rarely used applications. Here we go!
Why PowerShell and Important Safety Steps
The first question that may arise is, why use PowerShell when Windows settings include app uninstall options? Here are some of the reasons for using PowerShell over the default Windows settings.
- Remove hidden apps not available via the regular GUI interface
- Permanently remove apps that get reinstalled after updates
- Gives you complete control over permanent removal
And here are some of the important safety precautions before starting the app removal process.
- Always create a system restore point before triggering the app removal process.
- Take a backup of your PC to prevent any data loss.
- Always run PowerShell with administrative privileges.
- Test for one Windows account before system-wide removal of the app.
Alert: Do not remove critical or core Windows components, viz., Edge browser, Microsoft Store, etc. It may break the system. Unless you're not sure, do not remove an app.
Now that we know about the important steps we need to take before removing an app, let's dive in and learn the PowerShell commands for the same. From here on, I'll presume you're running a PowerShell instance on your PC with admin privileges.
Step 1: Create a Backup List
Start by creating a list of installed apps on your system. It'll ensure you can easily find the missing apps in case you want to undo or rollback the removal process.
# Save a list of your apps to the Desktop
Get-AppxPackage | Select Name, PackageFullName | Export-Csv -Path "$env:USERPROFILE\Desktop\AppxPackageList_CurrentUser.csv" -NoTypeInformation
# Save list of all users' apps (requires Admin privilege)
Get-AppxPackage -AllUsers | Select Name, PackageFullName | Export-Csv -Path "C:\Users\Public\AppxPackageList_AllUsers.csv" -NoTypeInformation
# Save a list of apps that auto-install for new accounts
Get-AppxProvisionedPackage -Online | Select DisplayName, PackageName | Export-Csv -Path "C:\Users\Public\ProvisionedPackages.csv" -NoTypeInformation
Through these commands, you get the .csv files with all the information about installed apps on your Windows machine.
Step 2: Find the Bloatware
Now that you have taken a backup of all the necessary information, let's find out the bloatware applications we want to remove from our Windows PC.
To view all the apps in a human-readable format, use the following command:
# View all apps in a readable list
Get-AppxPackage -AllUsers | Select Name, PackageFullName | Format-Table -AutoSize
To search for specific apps (for example: Xbox, Bing, Solitaire), execute the following command:
Get-AppxPackage -AllUsers | Where-Object {$_.Name -like "*bing*" -or $_.Name -like "*solitaire*"} | Select Name, PackageFullName
Some of the common bloatware apps that are safe to remove are:
- Games: Candy Crush, Solitaire, Xbox apps (if you're not a gamer)
- Trial Software: McAfee, Norton trials
- Redundant Apps: Multiple photo viewers, OEM utilities
- Unused Services: Mixed Reality, Skype (if you prefer Teams/Zoom apps)
These are just a few examples. Feel free to cherry-pick the apps you want to remove from your PC.
Step 3: Remove Apps (Just for Your Account)
Start by removing an app just for your account. This way, you can easily test if nothing gets broken on the system. Once satisfied, you can remove that app for all the accounts.
Here are a few examples of removing apps just for your Windows account.
# Remove one specific app
Get-AppxPackage -Name "Microsoft.XboxApp" | Remove-AppxPackage
# Remove all Xbox-related apps
Get-AppxPackage *xbox* | Remove-AppxPackage
# Remove multiple types at once
Get-AppxPackage *solitaire* | Remove-AppxPackage
Get-AppxPackage *bing* | Remove-AppxPackage
Pro Tip: Replace *xbox* with the app name pattern of your choice. The asterisk symbol acts as a wildcard.
I'd recommend removing each app one by one instead of deleting several at once. If anything goes wrong in the latter approach, it's very difficult to find the app that broke the system.
Step 4: Remove Apps for All the Accounts
If you want to remove an app for all the accounts on your PC, here's how you can do it.
# Remove for all users (for example: Solitaire)
Get-AppxPackage -AllUsers | Where-Object {$_.Name -like "*solitaire*"} | Remove-AppxPackage -AllUsers
Once again, I'll recommend removing each app one by one, instead of deleting them in bulk.
Step 5: Prevent Apps from Coming Back (Permanent Removal)
There's a special category of Windows apps called Provisioned Packages that not only come preinstalled with a new Windows install, but also get automatically reinstalled (if removed) through Windows updates.
To remove these apps and prevent them from reinstalling again, use the following commands:
# See which apps will auto-install
Get-AppxProvisionedPackage -Online | Select DisplayName, PackageName | Format-Table -AutoSize
# Remove a provisioned package (use the exact PackageName from above)
Remove-AppxProvisionedPackage -Online -PackageName "Microsoft.XboxApp_48.49.31001.0_neutral_~_8wekyb3d8bbwe"
Through the first command, you'll get the long package names of all the apps. These names are listed in the second column.
Step 6: Remove Traditional Programs
The commands given above only work for modern Windows apps that are generally installed through the Microsoft Store. If you want to remove a bloatware that is a regular application installed through an .exe setup file, these commands won't work.
To remove the latter category of software through PowerShell, find the uninstallation command for that application. Here's how you can find it through a PowerShell function.
# Function to find any program's uninstall command
function Find-UninstallString {
param([string]$DisplayNamePattern)
$keys = @(
'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall',
'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall',
'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall'
)
foreach ($k in $keys) {
Get-ChildItem $k -ErrorAction SilentlyContinue | ForEach-Object {
$props = Get-ItemProperty $_.PSPath
if ($props.DisplayName -and $props.DisplayName -match $DisplayNamePattern) {
[PSCustomObject]@{
DisplayName = $props.DisplayName
UninstallString = $props.UninstallString
}
}
}
}
}
Simply write this function on the PowerShell prompt and hit enter. It'll be automatically added to the current PowerShell environment and will be available for use.
Here's an example of using this function to find the uninstall string. You can see its usage in the image above, too.
# Example: Find McAfee or OEM software
Find-UninstallString -DisplayNamePattern "McAfee|HP|Dell|Lenovo"
After you get the uninstall string, copy it and run it without any modification from the PowerShell prompt. That's it!
Easier alternative: Use Windows Package Manager winget
There's an easy way as well. Use the winget tool to easily uninstall an application. Use the following command to first list all the installed applications on your PC.
# List installed programs
winget list
The listing includes both traditional applications and modern Windows apps.
winget commandNow, pick the name of the application you want to uninstall from column one and use the following command:
# Uninstall by name
winget uninstall "VLC media player"
Make sure to surround the application name with double quotes. You can uninstall any type of application through this command.
How to Undo Changes?
What if you accidentally delete an application you didn't want to? You can revert the changes in the following manner.
# Reinstall all default apps for your account
Get-AppxPackage -AllUsers | ForEach-Object {
$manifest = "$($_.InstallLocation)\AppXManifest.xml"
if (Test-Path $manifest) {
Add-AppxPackage -DisableDevelopmentMode -Register $manifest
}
}
The PowerShell script given above will restore all the default apps for the current Windows account.
# Reinstall just the Microsoft Store
Get-AppxPackage -allusers Microsoft.WindowsStore | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register "$($_.InstallLocation)\AppXManifest.xml"}
In this example, we've just reinstalled the Microsoft Store. Notice how it is reinstalled for all the accounts using the -allusers switch.
Ready-to-Use Cleanup Script for Removing Bloatware
If you don't have enough time to type and run each command one by one for each app, a full-fledged script to automate the entire bloatware removal process is what you need. Here's the script.
# Backup currently installed Appx packages (all users)
$timestamp = Get-Date -Format yyyyMMddHHmm
$backupPath = "$env:USERPROFILE\Desktop\AppxBackup_$timestamp.csv"
Get-AppxPackage -AllUsers |
Select-Object Name, PackageFullName, PackageFamilyName, Publisher, Version |
Export-Csv -Path $backupPath -NoTypeInformation
Write-Output "Backup saved to: $backupPath`n"
# Apps to remove (edit as per your requirements)
# Matches are case-insensitive and use wildcards.
$removeAppPatterns = @(
'*bing*',
'*xbox*',
'*solitaire*',
'*3dbuilder*',
'*skype*',
'*zunemusic*',
'*zunevideo*'
)
# Helper function to remove an Appx package for as many users as possible
function Remove-AppxPackageSafe {
param(
[Parameter(Mandatory=$true)]
[string]$PackageFullName
)
try {
# Newer Windows builds support -AllUsers; try it first.
Remove-AppxPackage -Package $PackageFullName -AllUsers -ErrorAction Stop
Write-Output "Removed for all users: $PackageFullName"
return
}
catch {
# Fall back: attempt removal per user context we can see.
$removedAny = $false
Get-AppxPackage -AllUsers | Where-Object { $_.PackageFullName -eq $PackageFullName } | ForEach-Object {
try {
Remove-AppxPackage -Package $_.PackageFullName -ErrorAction Stop
Write-Output "Removed: $($_.PackageFullName)"
$removedAny = $true
}
catch {
Write-Warning "Could not remove: $($_.PackageFullName) ($($_.Exception.Message))"
}
}
if (-not $removedAny) {
Write-Warning "Package not removed (might be system-protected): $PackageFullName"
}
}
}
# Loop through all the installed packages matching patterns and remove them
foreach ($pattern in $removeAppPatterns) {
Write-Output "Searching packages for pattern: $pattern"
$matches = Get-AppxPackage -AllUsers | Where-Object {
$_.Name -like $pattern -or $_.PackageFullName -like $pattern -or $_.PackageFamilyName -like $pattern
}
if (-not $matches) {
Write-Output "No packages found for: $pattern"
continue
}
$matches | Sort-Object PackageFullName -Unique | ForEach-Object {
Remove-AppxPackageSafe -PackageFullName $_.PackageFullName
}
}
# Remove provisioned packages (preinstalled for new users) to prevent reinstall
# Modify and update this list as per your needs
$provisionedAppPatterns = @('*xbox*', '*solitaire*', '*bing*')
foreach ($pattern in $provisionedAppPatterns) {
$prov = Get-AppxProvisionedPackage -Online | Where-Object { $_.DisplayName -like $pattern -or $_.PackageName -like $pattern }
if (-not $prov) {
Write-Output "No provisioned packages found for: $pattern"
continue
}
$prov | ForEach-Object {
Write-Output "Removing provisioned: $($_.DisplayName) ($($_.PackageName))"
try {
Remove-AppxProvisionedPackage -Online -PackageName $_.PackageName -ErrorAction Stop | Out-Null
Write-Output "Provisioned removed: $($_.PackageName)"
}
catch {
Write-Warning "Failed to remove provisioned: $($_.PackageName) ($($_.Exception.Message))"
}
}
}
Write-Output "`nCleanup complete! Check $backupPath if you need to restore anything."
The following things can be customized in this script to meet your requirements.
- You can modify the
$timestampvariable to customize the filename suffix. - Similarly, the
$backupPathvariable can be changed to specify the path of your choice. - Modify and edit the
$removeAppPatternsarray to add the apps you want to uninstall. - Lastly, modify the
$provisionedAppPatternsvariable to specify the provisioned apps you want to remove.
Troubleshooting Common Issues while Removing Bloatware
The following are some of the common errors or problems you may encounter while removing bloatware through PowerShell commands. Let's see how to tackle them.
- "Access denied" errors: Start PowerShell with administrator privileges.
- "Cannot remove" errors: System or critical apps can't be deleted. It's Windows' built-in safety mechanism.
- Apps come back after Windows update: You have not removed the provisioned package. Remove it, and you are good to go.
- System or functionality broke: Either use the System Restore feature or run the reinstallation commands given above.
Conclusion
PowerShell gives you the power to truly control what's on your Windows PC. The key is being methodical: back up first, remove carefully, and test thoroughly.
Start with obvious bloatware like games and trial software, then work your way up to more aggressive cleanup as you gain confidence. You can always reinstall apps from the Microsoft Store or use System Restore if something goes wrong. When in doubt, leave it installed.