如何要求用户使用 NSIS 卸载以前的版本

Posted

技术标签:

【中文标题】如何要求用户使用 NSIS 卸载以前的版本【英文标题】:How do I require user to uninstall previous version with NSIS 【发布时间】:2010-10-17 16:55:26 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

Function .onInit

         Exec $INSTDIR\uninst.exe 

FunctionEnd

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

【讨论】:

不要使用 $INSTDIR。使用您从注册表中读取的值来确保它是正确的。 这不会在后台启动卸载,并允许用户在卸载过程中继续安装【参考方案2】:

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

【讨论】:

当您将数据输入$R0 时,您不应该在ExecWait 中使用它吗?【参考方案3】:

我重复使用在安装期间写入的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"

【讨论】:

以上是关于如何要求用户使用 NSIS 卸载以前的版本的主要内容,如果未能解决你的问题,请参考以下文章

NSIS 卸载程序权限级别

生成在安装期间要求用户输入的电子 app.exe(使用电子生成器和 nsis)?

NSIS检测并卸载已有版本,静默卸载隐藏MessageBox

NSIS 如何在卸载时检测软件是不是运行并提示用户

如何从以前的非 msi 安装中复制文件?

根据安装程序的 NSIS 卸载程序权限