How to Remove Bloatware on Windows Using PowerShell Commands

On
Removing bloatware through PowerShell commands

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!

Removing bloatware through PowerShell commands
📷 Bloatware removal through PowerShell commands

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.

Read Also:
Best and Free Registry Optimizers to Fix and Boost Your Windows Performance

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.

  1. Always create a system restore point before triggering the app removal process.
  2. Take a backup of your PC to prevent any data loss.
  3. Always run PowerShell with administrative privileges.
  4. 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.

Uninstall string function for PowerShell
📷 Use this function to find the uninstall string of any Windows application

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.

list installed applciations using winget
📷 Both traditional and modern apps are listed through the winget command

Now, 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 $timestamp variable to customize the filename suffix.
  • Similarly, the $backupPath variable can be changed to specify the path of your choice.
  • Modify and edit the $removeAppPatterns array to add the apps you want to uninstall.
  • Lastly, modify the $provisionedAppPatterns variable 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.