====== 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 ===== # # 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