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。

谢谢!!

(在这里交叉发布)

4

2 回答 2

7

RemoveExistingProducts在行动之前安排InstallInitialize行动:

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

于 2012-07-16T06:31:12.727 回答
2

EdT在赛门铁克论坛上的回答

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

修复方法是重新排序 RemoveExistingProducts 操作,以便它在 InstallValidate 和 InstallInitialize 之间运行。这可确保在安装新版本之前完全删除旧应用程序。

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

于 2012-07-16T10:09:33.477 回答