Windows installer InstallShield由于卸载错误而失败

Windows installer InstallShield由于卸载错误而失败,windows-installer,upgrade,installshield,Windows Installer,Upgrade,Installshield,我正在构建一个InstallShield项目,它对现有安装进行[主要升级][1](即,我更改了产品代码,同时保留了升级代码) 以前版本(已部署)的卸载程序已损坏,无法运行某些脚本。这本身并不是一个严重的问题,因为所有相关文件都是事先删除的 问题是,当新安装程序尝试卸载以前的版本时,当卸载程序失败时,它会中止。我已尝试设置“故障时继续”标志(介质-->升级-->主升级-->高级-->其他设置),但没有效果 问题: 是否有一种方法可以配置为以静默方式删除以前的版本 如果没有,我可以编写一些自定义V

我正在构建一个InstallShield项目,它对现有安装进行[主要升级][1](即,我更改了
产品代码
,同时保留了
升级代码

以前版本(已部署)的卸载程序已损坏,无法运行某些脚本。这本身并不是一个严重的问题,因为所有相关文件都是事先删除的

问题是,当新安装程序尝试卸载以前的版本时,当卸载程序失败时,它会中止。我已尝试设置“故障时继续”标志(介质-->升级-->主升级-->高级-->其他设置),但没有效果

问题:

  • 是否有一种方法可以配置为以静默方式删除以前的版本
  • 如果没有,我可以编写一些自定义VB操作来静默卸载以前的版本吗
编辑

不确定这是否相关,但以下是以前的卸载程序的问题:


安装顺序包括一些自定义操作。其中两个调用可执行文件,这些可执行文件依次安装一些设备驱动程序。显然,它们应该只在安装过程中运行。遗憾的是,以前的设计器没有设置“不删除”条件,这会导致在卸载操作期间运行操作。因此,卸载程序失败(因为它找不到驱动程序可执行文件)。

这更多的是一个注释,而不是一个答案,但是对于注释来说它太长了

一般来说,真正的修复方法是创建一个次要升级(或次要升级补丁)来修复卸载序列中的错误,然后以正常方式卸载产品(无论是主要升级卸载还是手动触发卸载都有效)。这是可能的,因为小升级不会卸载现有产品(失败的卸载自定义操作将永远不会运行),而只是“就地”更新产品(或覆盖它)。这允许您在调用卸载序列之前修复卸载序列中的任何错误

我已经多次成功地使用此方法来修复公司软件包中的关键错误,这些软件包可能安装了大量实例,卸载顺序失败得很惨。然而,这并不是一件小事——它需要时间和测试努力。我通常也会以补丁的形式提供更新,但是一个小的升级就足够了(补丁很复杂)


对于次要升级包来说,最简单的方法可能是设置一个条件,该条件在所有失败的卸载自定义操作上都将始终为false,以便在实际触发卸载后,它们永远不会运行。这显然会在盒子上留下“一些垃圾”,但你可以忽略它,或者更好地清理它。但要小心清理代码——它往往会包含新的bug,您必须在适当的时候处理这些bug。部署是一个过程,在这个过程中,每个添加的发布周期、bug修复和调整都会为意外错误带来新的可能性,从而为下一个版本增加新的复杂性和不可预测性。让事情尽可能简单。简单地说:只是更多的东西,可以打破没有增加任何好处。如果出现操作问题,一定要清理干净,如果没有的话

关于如何实现小型升级,我将不做太多的详细介绍Installshield帮助文件在这个主题上非常好,应该可以帮助您完成任务。我会做一个更新,除了更改卸载操作的条件外,什么也不做

完成小升级后,您需要使用适当的命令行应用它,或者只需使用Installshield的setup.exe即可。再次查看Installshield帮助文件(“-此帮助页应该是您所需要的全部内容)

在没有setup.exe包装的情况下应用次要升级的命令行通常为:

msiexec.exe /i product.msi REINSTALLMODE=vomus REINSTALL=ALL
如果通过msiexec.exe手动安装而没有setup.exe包装,则为
重新安装模式
添加
的v选项
非常重要。这将在系统上缓存新的MSI,对于小升级能否正常工作至关重要,特别是对于修复卸载序列而言


通过小升级更改或删除现有软件包的MSDN文档是修复现有软件包的好方法。但要确保在主要升级之前实现这一点是一个难题。您不能将其集成到单个基本MSI包中,主要是因为这在Windows Installer本身中是不可能的。虽然您可以将自定义操作添加到UI序列中,但这对于以静默方式安装它的任何人都不起作用。由于Windows Installer中的限制,您无法在执行序列中执行任何操作

如果您可以使用套件/高级UI项目,理论上您可以交付一个exe来安装次要的,然后是主要的升级;我不确定这种方法的障碍是什么;通常情况下,该套件不会像小升级那样用于安装临时软件包,也没有在安装过程中自动删除软件包的干净方法

这里有两个选项可以帮助您的用户以最小的混乱达到他们需要的地方

识别、指示和中止

主要升级的ActionProperty中填充了计算机上存在的相关软件包的产品代码。通常这是一个单一的产品代码。如果遵循ISPRevent降级条目和自定义操作的模式,则可以使用类型19“错误”自定义操作显示消息,并在存在较旧版本时中止主要升级。该消息应指示用户在安装新版本之前卸载旧版本的产品;或者,也可以应用小升级,然后继续