Table of Contents

Windows - Get list of all applications

WMIC can't show all the programs using wmic (or anything else that makes WMI calls), unless all the programs on the machine are Windows Installer (MSI) packages, which would be rare. The Uninstall key in the registry is the only place that shows everything. It's what the Programs and Features list in Control Panel uses to populate the list of all programs.

There's a value in each registry entry under Uninstall labeled UninstallString. That contains the command you run to remove the program from the computer. Most of them will start with msiexec.exe /x, which are the ones returned by wmic. A program like WinRAR, for example, has its own uninstaller, and the command in the registry is C:\Program Files\WinRAR\uninstall.exe. Those will never be returned by wmic because they're considered non-standard, as far as WMI is concerned. Moreover, some of those non-standard ones may not support silent install/uninstall operations; it depends on how they were programmed/packaged.

To get them all, it's going to be a bit more complicated than just running wmic. You'd need several lines of Windows batch commands or Powershell expressions to grab all the UninstallString values and execute them.


Using WMIC

As administrator:

WMIC PRODUCT LIST BRIEF

result:

 

or

WMIC PRODUCT LIST FULL

result:

 

Using Registry

The venerable “Uninstall” key in the registry is the be-all/end-all of installed software.

reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s | findstr /B ".*DisplayName"
 
reg query "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" /s | findstr /B ".*DisplayName"

result:

 

NOTE: Wow6432Node for capturing 32-bit programs


Using Powershell

gp HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* |Select DisplayName, DisplayVersion, Publisher, InstallDate, HelpLink, UninstallString |ogv

result:

 

Using Powershell Script

apps.ps
#
# Generates a full list of installed programs.
#
 
# Temporary file.
$tmpFile = "tmp.txt"
 
# File that will hold the programs list.
$fileName = "programs-installed.txt"
 
# Columns separator.
$separator = ","
 
# Delete previous files.
Remove-Item $tmpFile
Remove-Item $fileName
 
# Creates the temporary file.
Create-Item $tmpFile
 
# Search register for programs - part 1.
$loc = Get-ChildItem HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall
$names = $loc |foreach-object {Get-ItemProperty $_.PsPath}
foreach ($name in $names)
{
    IF(-Not [string]::IsNullOrEmpty($name.DisplayName)) {      
        $line = $name.DisplayName+$separator+$name.DisplayVersion+$separator+$name.InstallDate
        Write-Host $line
        Add-Content $tmpFile "$line`n"        
    }
}
 
# Search register for programs - part 2.
$loc = Get-ChildItem HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
$names = $loc |foreach-object {Get-ItemProperty $_.PsPath}
foreach ($name in $names)
{
    IF(-Not [string]::IsNullOrEmpty($name.DisplayName)) {      
        $line = $name.DisplayName+$separator+$name.DisplayVersion+$separator+$name.InstallDate
        Write-Host $line
        Add-Content $tmpFile "$line`n"
    }
}
 
# Sorts the result, removes duplicate lines and
# generates the final file.
gc $tmpFile | sort | get-unique > $filename