Table of Contents

removeMSI

CALL:

set $result$ = removeMSI("dummy")

NOTE:
$result$ must be from Type “StringList”

Usage

Check WINST Manual:
9.22. Local functions
9.23. Import von Library Funktionen

config

Create a file named msi.conf in your %ScriptDir%
In this file, you have to include all MSIIDs you want to remove in the following format:
Desciption of your Software:{your-msi-id}
For example:

vcredist_x64_2010:{1D8E6291-B0D5-35EC-8441-6616F567A0F7}

Retrurn StringList

You will get the following information back (in case of an error):

[0] = Description
[1] = ExitCode
[2] = Error Desciption (If known, otherwise UNKNOWN)

In case of ExitCode 0, 1605, 1641 or 3010 you will only get the following Information back:

[0] = All Products uninstalled
[1] = 0
[2] = All Products uninstalled

CODE

DefFunc RemoveMSI(val $remove$ : string) : stringlist
	DefStringList $msiidsAndDescription$
	DefStringList $transformList$
	DefVar $ID$
	DefVar $description$
	DefVar $ExitCode$
	
	set $msiidsAndDescription$ =	loadTextFile ("%scriptpath%\msi.conf")
	
	for %i% in $msiidsAndDescription$ do sub_extract_id_and_description
	
	[sub_extract_id_and_description]	
	set $transformList$ = splitstring("%i%",":")
	
	set $Description$ = takestring(0,$transformList$)
	set $ID$ = takestring(1,$transformList$)
	set $transformList$ = emptylist($transformList$)

	Message "remove "+$Description$
	
	
	if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $ID$ + "] DisplayName") = "")
		comment "MSI id " + $ID$ + " found in registry, starting msiexec to uninstall"
		Winbatch_uninstall_msi
		sub_check_exitcode
	endif
	
	if not (GetRegistryStringValue64("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $ID$ + "] DisplayName") = "")
		comment "MSI id " + $ID + " found in registry, starting msiexec to uninstall"
		Winbatch_uninstall_msi
		sub_check_exitcode
	endif
	
	
	[Winbatch_uninstall_msi]
	msiexec /x $ID$ /qb-! REBOOT=ReallySuppress
	
	[sub_check_exitcode]
	set $ExitCode$ = getLastExitCode

	Switch $ExitCode$
        Case "0"
               comment "Looks good: setup program gives exitcode zero"
               set $result$ = emptylist($result$)
               set $result$ = addToList($result$,"All Products uninstalled")
               set $result$ = addToList($result$,"0")
               set $result$ = addToList($result$,"All Products uninstalled")
        EndCase
        case "1605"
          		set $result$ = addToList($result$,$Description$)
                set $result$ = addToList($result$,$ExitCode$)
                set $result$ = addToList($result$,"ERROR_UNKNOWN_PRODUCT	1605	This action is only valid for products that are currently installed")
		EndCase
		case "1641"
          		set $result$ = addToList($result$,$Description$)
                set $result$ = addToList($result$,$ExitCode$)
                set $result$ = addToList($result$,"ERROR_SUCCESS_REBOOT_INITIATED	1641	The installer has initiated a restart. This message is indicative of a success.")
		EndCase
		case "3010"
          		set $result$ = addToList($result$,$Description$)
                set $result$ = addToList($result$,$ExitCode$)
                set $result$ = addToList($result$,"ERROR_SUCCESS_REBOOT_REQUIRED	3010	A restart is required to complete the install. This message is indicative of a success.")
		EndCase
        DefaultCase
        		Message $exitcode$
                set $result$ = addToList($result$,$Description$)
                set $result$ = addToList($result$,$ExitCode$)
                set $result$ = addToList($result$,"UNKNOWN")
                isFatalError
        EndCase
     EndSwitch
EndFunc
	

Sample usage in delsub.opsiscript

All MSI Software Packages defined in the msi.conf file will be removed.

importLib "removeMSI.opsiinc"
DefStringList $result$

set $result$ = removeMSI("dummy")

Questions, bug reports, feature request, or just an idea for new crazy functions ???

This Function is Part of my OPSI-WINST-LIBRARY Bundle, which home is on GitHUB.
Feel free to share your Ideas for new functions or contact me there for bug reports.
OPSI-WINST-Library on GitHUB