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

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

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

【问题讨论】:

    标签: installation nsis uninstallation


    【解决方案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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-13
      • 2012-08-23
      • 2013-09-01
      • 1970-01-01
      • 2011-03-15
      • 2019-01-28
      • 2018-09-29
      • 1970-01-01
      相关资源
      最近更新 更多