10

我刚刚开始使用NSIS
它工作得很好,但我发现文档有点非结构化。在使用NSIS安装新版本之前,如何要求用户卸载以前的版本?

NSIS(Nullsoft Scriptable Install System)是一个用于创建 Windows 安装程序的开源系统。

4

3 回答 3

15

NSIS 是一个很棒的 Windows 安装程序。这是我在安装同一应用程序的新版本时使用 NSIS 卸载当前版本的方法。将以下函数添加到您的 NSIS 脚本。

Function .onInit

         Exec $INSTDIR\uninst.exe 

FunctionEnd

您也可以在 NSIS wiki 上查看“在安装新版本之前自动卸载旧版本”的链接

于 2009-04-05T23:02:44.587 回答
15

另一种方法是创建一个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 的方法。

于 2009-11-06T20:54:06.597 回答
1

我重用在安装过程中写入的UninstallStringQuietUninstallString注册表项,以便稍后确定卸载程序命令。

一对夫妇在顶部定义:

!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"
于 2013-10-17T20:22:37.240 回答