I needed to be able to determine the uninstall program for a program that was installed on a system by querying the registry. When you go to the Control Panel and choose "Add or Remove Programs" or "Uninstall a Program", you see a list of installed programs, such as is shown below:
The information listed there is associated with
Uninstall
registry keys that are found at
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
in the
Windows registry.
I created a batch file to query the registry to show all of the
programs that have such an Uninstall
key and that will
accept a program name and return the uninstall command found under that
key for the program.
C:\Users\JDoe\Downloads>uninstallstring AddressBook Adobe Flash Player ActiveX All ATI Software ATI Display Driver CDisplay_is1 Connection Manager DirectDrawEx DXM_Runtime Fontcore IE40 IE4Data IE5BAKEX IEData MobileOptionPack MPlayer2 PuTTY_is1 RealPopup_is1 SchedulingAgent SecondLife Total Uninstall 5_is1 Vim WIC {9D07059A-EC99-4F03-9BF2-BE40FB007822} {FB08F381-6533-4108-B7DD-039E11FBC27E} C:\Users\JDoe\Downloads>uninstallstring vim C:\Program Files\vim\vim72\uninstall.exe C:\Users\JDoe\Downloads>uninstallstring gvim ERROR: The system was unable to find the specified registry key or value. C:\Users\JDoe\Downloads>uninstallstring Adobe Flash Player ActiveX C:\Windows\system32\Macromed\Flash\uninstall_activeX.exe
The batch file is as follows:
@echo off REM uninstallstring.bat REM REM Written By: Jim Cameron REM Created: 2009-12-29 REM Last Modified: 2009-12-30 REM Version: 1.0 REM REM Usage: REM REM uninstallstring REM uninstallstring program REM REM Purpose: If no arguments are given to the batch file on the command line, REM it will display a list of all the programs with UninstallString values, REM i.e., all the registry keys under REM HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall. If REM an argument appears on the command line, it should be one of the values REM reported when no arguments are given to the script, i.e. a program name, REM such as "vim" or "Adobe Flash Player ActiveX" (don't actually put the quotes REM around the names, even if there are spaces in the name. E.g. for the latter REM case you would use the following: REM REM uninstallstring Adobe Flash Player Activex REM REM When a program name is included on the command line, uninstallstring.bat REM will determine the "UninstallString" value in the registry for that REM particular program, i.e. the location for the uninstall program for a REM particular piece of software. It will return just that value. E.g., for REM the "uninstallstring vim", it would return the following: REM REM C:\Program Files\vim\vim72\uninstall.exe REM REM If it can not find an uninstall registry value for the program listed it REM will return the following: REM REM ERROR: The system was unable to find the specified registry key or value. REM The following example shows a "reg query" command that could be issued from REM the command line to determine the value of "UninstallString" for the Vim REM editor software. The last line of output contains the "value name", REM "value type", and "value data", which is the part of the output of interest. REM C:\>reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Vim /v UninstallString REM REM HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Vim REM UninstallString REG_SZ C:\Program Files\vim\vim72\uninstall.exe REM First, display the UninstallString values present in the registry. REM Values returned by the reg query command will be in the following format: REM REM HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Vim IF "%1"=="" ( GOTO Show_All ) ELSE ( GOTO Find_String ) :Show_ALL set _All=reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall FOR /f "tokens=6* delims=\" %%A IN ('%_All%') Do echo %%B GOTO End :Find_String REM Set _Program to be the parameter entered on the command line. REM Use %* rather than %1 to cover cases where the program has spaces in the REM name. set _Program=%* REM Set the variable _UninstallString_Query to the reg query command to be issued. set _UninstallString_Query=reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\%_Program%" /v UninstallString REM There are two parts at the beginning of the line, the "value name" and the REM "value type" that aren't relevant, By specifying "2*" the "value name" is REM ignored, the "value type" goes into %%A and %%B holds everything else on REM the line. FOR /f "skip=2 tokens=2*" %%A IN ('%_UninstallString_Query%') Do echo %%B :End
References:
-
Creating DOS Batch Files
Useful Information: tons of info stuffed into a small site -
For /f - Looop through text
SS64.com Command line reference -
For - Looop through command output
SS64.com Command line reference -
Batch files - How To ... Verify if Variables are Defined
Rob van der Woude's Scripting Pages -
Microsoft Windows XP - If
Microsoft Corporation -
Microsoft DOS if command
Computer Hope's free computer help -
Information on batch files
Computer Hope's free computer help -
Microsoft Registry Tools
Softpanorama (slightly skeptical) Open Source Software Educational Society -
Quotes, Escape Chars, Delimiters
SS64.com Command line reference -
Tips for using the Windows command prompt in Windows XP
The Command Line in Windows -
Batch File Command Reference
At The Data Center - by Don WIlwol -
Batch file count tokens in var
Computing.net Computer Tech Support Forum