如何在 msi 安装过程中卸载以前的版本



我有一个包装成MSI的产品。当我的客户在现有版本之上安装我的产品的新版本时,由于自定义 VBS 操作,它无法正常工作,如下所述。我的问题是:我如何更改我的 MSI,以便顶部安装将始终事先完全卸载任何现有版本?

具体内容如下:

我有一个产品,在各种不同的公司部署了各种版本。大约每年一次,我的每个客户都会收到我的产品的新版本,并部署到他们公司的工作站上。负责部署的人员希望他们可以在旧版本之上安装新版本,而不必在其安装包中包含卸载步骤。

msi 安装会创建一些文件并将其写入 [CommonApplicationData]\MyApp 文件夹。在执行期间,应用程序会在 [CommonApplicationData]\MyApp 文件夹中创建更多文件。在卸载过程中,我需要删除所有这些文件。由于它们不是由 msi 安装的,因此它们不会自动卸载,因此我创建了一个 vbs 脚本来删除该文件夹及其中的其他任何内容。我在执行延迟中放置了一个命令来执行该 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。

谢谢!!

(此处交叉发布)

InstallInitialize操作之前安排RemoveExistingProducts操作:

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

来自赛门铁克论坛上的 EdT 的答案

如果您已使用标准 Wise 模板进行安装,则"删除现有产品"操作将在"安装执行"序列的末尾排序。尽管从技术上讲,这是最"有效"的位置,但除非您在创建新包以升级旧包时非常小心地运行 UpgradeSync,否则最终结果通常是丢失文件或其他异常之一。

解决方法是重新调用"删除现有产品"操作,以便它在"安装验证"和"安装初始化"之间运行。这可确保在安装新版本之前完全删除旧应用程序。

在帮助文件 MSI 中查找"删除现有产品"。CHM 以获取有关定位此操作的选项的更详细说明。

最新更新