我有一个包装成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 以获取有关定位此操作的选项的更详细说明。