What’s on Your Machine? 3 Ways to List Installed Apps via PowerShell
Whether you are auditing a new workstation, cleaning up your own PC, or preparing for a fresh Windows install, you often need a complete list of what is actually installed. While the “Add or Remove Programs” menu is fine for casual use, PowerShell offers more power, more detail, and the ability to export your results.
Here are the three best ways to pull a full software inventory from your machine.
1. The Deep Dive: Querying the Windows Registry
This is the most thorough method for finding traditional desktop software (.exe and .msi). It checks the “Uninstall” keys in the registry for 64-bit, 32-bit, and user-specific applications.
PowerShell
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*,
HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*,
HKCU:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* |
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
Where-Object { $_.DisplayName -ne $null } |
Sort-Object DisplayName
2. The Modern Standard: winget list
If you are on Windows 10 or 11, you likely have the Windows Package Manager (winget) built-in. It provides a clean, formatted table that includes both traditional apps and Microsoft Store apps.
To see your list, simply run:
PowerShell
winget list
Pro Tip: If you only want to see apps that have a pending update, use:
winget list --upgrade-available
3. Finding “Modern” Apps: Get-AppxPackage
The registry method often skips built-in Windows apps like Calculator, Photos, or apps installed strictly through the Microsoft Store. To audit these specifically, use the AppX cmdlet:
PowerShell
Get-AppxPackage | Select-Object Name, PackageFullName | Sort-Object Name
Comparison: Which Method Should You Use?
| Method | Best For… | Output Style |
| Registry | Professional Auditing | Very Detailed |
| Winget | Quick Human Reading | Clean Table |
| Appx | Windows Store Apps | System Names |
A Quick Warning on Win32_Product
If you search the web for this topic, you will often see scripts using Get-WmiObject Win32_Product. Avoid this command. It is incredibly slow and, due to its design, can actually trigger Windows to perform “consistency checks” or “repairs” on your software just by listing it. Stick to the Registry or Winget methods above for a safer, faster experience.
How to Export Your List
If you want to save this list to a file to look at later (or move to a new computer), just add | Out-File to the end of your command:
PowerShell
# Example: Exporting the registry list to a text file
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* |
Select-Object DisplayName | Out-File "$env:USERPROFILE\Desktop\MyApps.txt"
Note on Winget List:
he winget list command was officially introduced as part of the Windows Package Manager v1.0 stable release on May 26, 2021.
While the winget tool itself was first announced in a preview state at Microsoft Build in May 2020, the specific ability to list all installed applications (even those not installed via winget) was one of the headline features of the 1.0 release a year later.
Key Milestones for winget list:
- May 2020:
wingetis first announced (v0.1). Early versions focused mainly oninstall,search, andshow. - May 26, 2021: Version 1.0 is released. This version officially added the
list,upgrade,uninstall,import, andexportcommands, making it a complete package manager. - September 2020 (Preview): Prior to the 1.0 release, experimental support for listing and installing Microsoft Store apps was added, which eventually matured into the
listcommand we use today.
Why was it a big deal?
Before the list command, winget could only really see things it had installed itself. When winget list arrived in 1.0, it gained the ability to “see” almost everything in your Windows Add/Remove Programs list, regardless of how it was installed. This turned winget from a simple downloader into a legitimate system audit tool.
