【问题标题】:Installshield : custom action to uninstall previous version and install the latest versionInstallshield :卸载以前版本并安装最新版本的自定义操作
【发布时间】:2018-04-30 04:04:12
【问题描述】:

我的要求如下:

  1. 如果应用程序的版本例如12.0 安装在 C:\Folder1 并且 13.0 版本的安装程序将安装在文件夹 C:\Folder1 中,然后 13.0 版本的安装程序应静默卸载 12.0 版本并安装最新版本 13.0

  2. 如果应用程序的版本例如12.0 安装在C:\Folder1 并且版本 13.0 的安装程序将安装在文件夹 C:\Folder200 中,那么版本 13.0 的安装程序应安装最新版本并保留版本 12.0

我尝试过的事情:

  1. 如果我使用升级码方法卸载之前的版本,那么即使之前的版本安装在系统的任何位置,也会发生之前版本的卸载。

  2. 使用自定义操作 - 创建一个 vbscript 以使用 WindowsInstaller.Products 数据读取已安装的产品,并使用产品代码创建一个命令以使用“msiexec.exe /x ProductCode”卸载应用程序

    • 在安装屏蔽项目的“文件传输之前”部分中添加此自定义操作时,会弹出“应用程序正在安装版本并等待它完成该过程”的弹出窗口。
    • 自定义操作的“等待操作”属性设置为是。
    • 我尝试将其设置为“否”,但仍然出现相同的弹出窗口。
    • 如果我在 install shield 项目的“设置完成后成功对话框”部分添加自定义操作,则安装两个版本,并且在 vbscript 执行后,它会卸载以前的版本。 这种方法的问题是,当我双击应用程序的桌面图标时;它开始安装并显示安装进度的弹出窗口。这会让客户感到困惑。 所以这种方法不适合。
  3. 我们没有在注册表中添加任何数据,因此无法使用注册表方法卸载以前的版本。

这是任何软件的一个非常基本的要求,但我无法弄清楚如何实现这一点。如果有人有一些指示,请告诉我。

我有 Installshield 限量版 2015 和 Visual Studio 2015 Professional。

【问题讨论】:

    标签: installation windows-installer installshield custom-action


    【解决方案1】:

    这实际上不是“任何软件的基本要求”。基础是如果安装了 ProductCode/UpgradeCode 进行升级。

    对于第 2 点,您会收到弹出窗口,因为您尝试同时运行 2 个 MSI ExecuteSequences。如果您想继续这条路,您必须将卸载操作移至 UISequence。请注意,静默安装不会运行此操作,因为它永远不会命中 UISequence。此外,走这条路的更好方法是构建您自己的引导程序 (setup.exe) 来控制卸载/安装流程。

    【讨论】:

      【解决方案2】:

      您不能这样做,因为升级(主要升级)MSI 不关心以前版本的产品安装在哪里。带有 UpgradeCode(和一些其他细节)的新 MSI 将升级匹配的现有产品,在安装旧产品的任何地方卸载旧产品。

      一些问题(不是完整列表):

      1. 如果您想安装另一个产品而不升级现有产品,那么您需要一个(例如)具有不同 UpgradeCode 或不执行 RemoveExistingProducts 的 MSI。

      2. 您的 MSI(旧的和新的)需要设置 ARPINSTALLLOCATION,因此您可以询问它们的安装位置。这使您可以比较安装位置(但 IMO 不是理想的解决方案)。

      3. 现在两个单独安装的产品在开始菜单中是否有相同的快捷方式,公共位置是否有共享文件,是否有不可共享的项目(服务名称,全局事件名称等)。

      4. 还有可维护性问题,例如如何升级或修补两个几乎相同的已安装产品。

      无论如何,我只会询问用户是否要升级或并行安装,而不是根据文件夹的选择做出决定(这似乎是 IMO 选择安装位置的不寻常副作用) .

      一般选择可能基于在 RemoveExistingProducts 操作上具有条件、基于命令行属性或其他机制。或者,根据可维护性要求,您可以更改升级代码(在命令行上使用转换),以便不会发生升级。我不清楚在新安装的浏览文件夹对话框中检测上一个 MSI 的安装位置是否简单。

      【讨论】:

      • 这些场景确实不适用于 MSI,是吗?我希望未来的部署技术做得更好。我在回答中添加了一些关于 instance transforms 概念的信息——尽管我非常不喜欢这个概念。不确定您在这方面的看法。感觉就像把人们误入歧途。
      【解决方案3】:

      恐怕 MSI 不太适合这种情况 - 正如您所发现的那样。

      • 这是一款企业软件,还是用于一般、大规模的分发
      • 这种多实例方法的目的是什么?此 MSI 是否有效地安装了同一应用程序的两个不同版本?

      实例转换:我想你可以研究一下instance transforms 的概念。它旨在允许多个安装,但我不喜欢这个概念并且从未积极使用它。因此,我无法向您提供有关限制和陷阱的内幕 - 抱歉 - 也许其他人可以说明一下?

      正如 PhilDW 所说,您可以为最新的 MSI 使用另一个升级代码,然后与旧安装并排安装。除了已经提到的内容之外,您还需要更改新包的所有组件 GUID。 WiX 允许根据目标路径自动生成组件 GUID,但对于 Installshield,则不然。 The instance transform 应该可以在不更改所有组件 GUID 的情况下并行安装 - 我相信。

      App-V:如果您在公司环境中,并且如果我有足够的经验,我还建议您查看 App-V 打包(虚拟化)。这允许隔离应用程序,以便多个版本可以并行运行。但同样,我不是给你内幕的合适人选。我知道有很多限制,但无法根据实际经验详细说明。

      Setup.exe 启动器:如果您的应用程序可以优雅地处理多个实例,而不会发生快捷方式和服务名称等冲突...(如 Phil 所描述),那么您可以安装所有新版本并排,默认情况下从不通过升级表卸载旧版本。然后,您可以在 setup.exe 启动器(如果有)中手动处理以前版本的卸载。我想您可以使用实例转换概念来安装新版本,或者您可以使用所有新组件 GUID 以及产品、软件包和升级 GUID 为每个新版本重新创建设置。

      旧版 Installscript 项目:我想您可以放弃 MSI 并使用旧版 Installscript 项目来部署您的应用程序。我不建议这样做,因为此类项目对于可靠的远程管理和静默运行(安装和卸载)存在问题。


      一些安全链接:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-03
        • 1970-01-01
        • 2012-08-23
        • 2021-05-24
        • 2017-01-07
        • 1970-01-01
        相关资源
        最近更新 更多