【发布时间】:2017-10-24 15:55:35
【问题描述】:
我正在构建一个 InstallShield 项目,该项目对现有安装进行 [主要升级][1](即,我更改了 Product Code,同时保留了 Upgrade Code)。
之前版本(已部署)的卸载程序损坏,无法运行某些脚本。这本身并不是一个严重的问题,因为所有相关文件都已预先删除。
问题是当新的安装程序尝试卸载以前的版本时,它会在卸载程序失败时中止。我尝试设置“失败时继续”标志(媒体-->升级-->主要升级-->高级-->附加设置),但没有任何效果。
问题:
- 有没有办法将 IS 配置为静默删除以前的版本?
- 如果没有,我可以编写一些自定义 VB-action 以静默卸载以前的版本吗?
编辑
不确定这是否相关,但这是以前的卸载程序的问题:
安装顺序包括一些自定义操作。其中两个调用可执行文件,然后安装一些设备驱动程序。显然,它们应该只在安装过程中运行。不幸的是,以前的设计者没有设置“不删除”条件,这会导致操作在卸载操作期间运行。因此卸载程序失败(因为它找不到驱动程序可执行文件)。
【问题讨论】:
-
在您的旧 MSI 中 InstallFinalize 之后,您是否碰巧有即时模式自定义操作设置为“检查返回码”?
-
@SteinÅsmul - 旧的 MSI 确实包含一些经过 InstallFinilize 的自定义操作,但它们不检查返回码。但它们确实存在错误——其中两个操作调用可执行文件来安装特定的设备驱动程序。显然,它们应该只在安装应用程序时运行,但没有设置“NOT REMOVE”条件。这会导致卸载操作无法运行该操作,并且操作失败。
-
一般情况下 InstallFinalize 之后不应该有即时模式自定义操作(除非它们是只读的),并且即时模式自定义操作绝不能对系统进行更改(它们不会运行提升并且会失败对于非管理员用户并且他们在安装事务之外运行,因此回滚不可用)。最后,如果您仅在 UI 序列中插入自定义操作,则在静默运行时您的设置将不会完成,因为在这种情况下会完全跳过 UI 序列。您确定没有检查退出代码吗?请报告自定义操作表中“类型”字段的内容。
-
@SteinÅsmul - 感谢您的建议。这些操作出现在“序列-->安装-->执行”下,它们会在没有 UI 的情况下运行吗?至于类型,它们都是脚本函数(类型 0x0x1:
msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData),然后在另一个 exe 上调用LaunchAppAndWait()。 -
@SteinÅsmul - 两个项目都有
Return Processing: Synchronous (Check exit code)。这是你的意思吗?
标签: windows-installer upgrade installshield