How do I require user to uninstall previous version with NSIS
-
23-08-2019 - |
Question
Solution
NSIS is a great Windows Installer. Here is how I use NSIS to uninstall the current version while installing a new version of the same application. Add the following function to your NSIS script.
Function .onInit
Exec $INSTDIR\uninst.exe
FunctionEnd
Also you can check out this link on the NSIS wiki on "Auto-uninstall old before installing new".
OTHER TIPS
Another approach is to make a UninstallPrevious
hidden section and make it run before all other sections in the installer. I also suggest making the uninstaller run silently.
; The "" makes the section hidden.
Section "" SecUninstallPrevious
Call UninstallPrevious
SectionEnd
Function UninstallPrevious
; Check for uninstaller.
ReadRegStr $R0 HKLM "${HKLM_REG_KEY}" "InstallDir"
${If} $R0 == ""
Goto Done
${EndIf}
DetailPrint "Removing previous installation."
; Run the uninstaller silently.
ExecWait '"$R0\Uninstall.exe /S"'
Done:
FunctionEnd
The advantage of this approach is that the user won't uninstall the old version until they're ready to install the new version. Furthermore, they don't even have to make a decision about uninstalling the old version, it just magically disappears.
Of course, depending on your needs, you may want the user to confirm uninstalling, in which case use the spinner_den's approach.
I reuse the UninstallString
or QuietUninstallString
registry keys that get written during the install to later determine the uninstaller command.
A couple defines at the top:
!define PROJECT_REG_UNINSTALL_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PROJECT_NAME}"
!define PROJECT_UNINSTALL_EXE "uninstall.exe"
In the installer Section
:
WriteRegStr HKLM "${PROJECT_REG_UNINSTALL_KEY}" "UninstallString" '"$INSTDIR\${PROJECT_UNINSTALL_EXE}" _?=$INSTDIR'
WriteRegStr HKLM "${PROJECT_REG_UNINSTALL_KEY}" "QuietUninstallString" '"$INSTDIR\${PROJECT_UNINSTALL_EXE}" /S _?=$INSTDIR'
And then in your .onInit
grab the registry key value (would exist if your app was already installed this way) and run it:
${If} ${Silent}
ReadRegStr $R0 HKLM "${PROJECT_REG_UNINSTALL_KEY}" "QuietUninstallString"
${Else}
ReadRegStr $R0 HKLM "${PROJECT_REG_UNINSTALL_KEY}" "UninstallString"
${EndIf}
ExecWait "$R0"