我刚开始使用NSIS 它工作得很好,但我发现文档有点非结构化。 在使用NSIS安装新版本之前,如何要求用户卸载以前的版本?
NSIS(Nullsoft Scriptable Install System)是一个用于创建Windows安装程序的开源系统。
答案 0 :(得分:13)
NSIS是一款优秀的Windows Installer。以下是我在安装同一应用程序的新版本时使用NSIS卸载当前版本的方法。将以下函数添加到NSIS脚本中。
Function .onInit
Exec $INSTDIR\uninst.exe
FunctionEnd
另外,您可以在“安装新内容之前自动卸载旧版”中查看NSIS wiki上的this链接。
答案 1 :(得分:13)
另一种方法是创建一个UninstallPrevious
隐藏部分,并使其在安装程序中的所有其他部分之前运行。我还建议让卸载程序默默运行。
; 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
这种方法的优点是用户在准备好安装新版本之前不会卸载旧版本。此外,他们甚至不必做出卸载旧版本的决定,只是神奇地消失了。
当然,根据您的需要,您可能希望用户确认卸载,在这种情况下使用spinner_den的方法。
答案 2 :(得分:1)
我重用了安装期间编写的UninstallString
或QuietUninstallString
注册表项,以便稍后确定卸载程序命令。
一对夫妇在顶部定义:
!define PROJECT_REG_UNINSTALL_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PROJECT_NAME}"
!define PROJECT_UNINSTALL_EXE "uninstall.exe"
在安装程序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'
然后在你的.onInit
中获取注册表项值(如果你的应用程序已经以这种方式安装就会存在)并运行它:
${If} ${Silent}
ReadRegStr $R0 HKLM "${PROJECT_REG_UNINSTALL_KEY}" "QuietUninstallString"
${Else}
ReadRegStr $R0 HKLM "${PROJECT_REG_UNINSTALL_KEY}" "UninstallString"
${EndIf}
ExecWait "$R0"