我有一个打包为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,以便先卸载以前的版本?
值得注意的是,我有很多公司安装了现有版本的MSI,其中包含自定义vbs。因此,解决方案确实需要能够应对现有已安装的msi。
我使用Wise Installation Express 7.0来创建MSI。
谢谢!
(交叉发布here)
答案 0 :(得分:6)
在InstallInitialize
行动之前安排RemoveExistingProducts
行动:
在这种情况下,安装程序会在安装新应用程序之前完全删除旧应用程序。这是操作的低效放置,因为必须重新复制所有重用的文件。
答案 1 :(得分:2)
在赛门铁克论坛上回答from EdT
如果您已使用标准Wise模板进行安装,则在InstallExecute序列结束时对RemoveExistingProducts操作进行排序。虽然从技术上讲这是最“有效”的位置,但除非您在创建新包时非常小心地运行UpgradeSync以升级旧包,否则最终结果通常是丢失文件或其他异常之一。
修复程序是重新排序RemoveExistingProducts操作,以便它在InstallValidate和InstallInitialize之间运行。这可确保在安装新版本之前完全删除旧应用程序。
在帮助文件MSI.CHM中查找“RemoveExistingProducts”,以获取有关定位此操作的选项的更详细说明。