如何在MSI安装的过程中卸载先前的版本?

6
我有一个作为MSI打包的产品。当我的客户在现有版本之上安装新版本时,由于自定义的VBS操作,它不能正常工作,如下所述。我的问题是:我如何更改我的MSI,以便在顶部安装始终会在此之前完全卸载任何现有版本?
详情如下:
我有一个具有各种版本的产品,部署在不同公司的各个工作站上。每年大约一次,每个客户都会收到新版本的产品并部署到他们公司的工作站。负责部署的人希望他们可以安装新版本覆盖旧版本,而不是必须在安装程序中包含卸载步骤。
msi安装将创建并写入一些文件到[CommonApplicationData]\ MyApp文件夹中。在执行过程中,应用程序会在[CommonApplicationData]\MyApp文件夹中创建更多文件。在卸载期间,我需要删除所有这些文件。由于它们不是由msi安装的,因此它们不会自动卸载,因此我创建了一个vbs脚本来删除该文件夹及其中的任何其他内容。我在ExecuteDeferred中放置了一个命令来执行该vbs:
...
RemoveFiles
RemoveFolders
CreateFolders
MoveFiles
InstallFiles
PatchFiles
If REMOVE="ALL" Then
    REM line below is my custom script
    call VBScript From Installation (MyApp_UninstallCleanup)  
End
DuplicateFiles
BindImage
CreateShortcuts
...

到目前为止一切都很好,安装和卸载都正常。然而,如果我在现有版本的顶部安装新版本,似乎会按照以下步骤进行: a)安装新版本,在[CommonApplicationData]\MyApp文件夹和[Program Files]\MyApp…中创建各种文件,覆盖旧版本的文件。 b)运行我的vbs,删除[CommonApplicationData]\MyApp文件夹。
我在我的新MSI的升级表中列出了旧版本的GUID,除此之外,除了这个自定义脚本,升级过程似乎都正常工作。
该产品本身非常小,因此,如果安装程序始终在安装新版本之前完全删除旧版本,则无妨。工作站上没有需要保留的用户设置,文件大小也不大。因此,出于简单起见,我希望以卸载先前版本而不是更新仅更改了的部分来完成。
有没有办法更改我的新MSI,使其首先卸载以前的版本?
值得注意的是,安装了包含自定义vbs的现有MSI版本的许多公司。因此,解决方案确实需要能够处理现有已安装的msi。
我使用Wise Installation Express 7.0创建了MSI。

谢谢!!

(在这里交叉发布)

2个回答

7

InstallInitialize 操作之前安排 RemoveExistingProducts 操作:

在这种情况下,安装程序会在安装新应用程序之前完全删除旧的应用程序。 这是一种效率低下的操作位置,因为所有重复使用的文件都必须重新复制。


2

来自Symantec论坛EdT的答案:

如果您使用了标准的Wise模板进行安装,则RemoveExistingProducts操作会在InstallExecute序列的末尾排序。虽然从技术上讲,这是最“高效”的位置,但除非您在创建新包以升级旧版本时非常仔细地运行UpgradeSync,否则最终结果通常是缺少文件或其他异常。

解决方法是重新排列RemoveExistingProducts操作,使其在InstallValidate和InstallInitialize之间运行。这确保在安装新版本之前完全删除旧应用程序。

在帮助文件MSI.CHM中查找“RemoveExistingProducts”以获取有关定位此操作选项的更详细说明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接