【发布时间】:2022-08-18 03:47:51
【问题描述】:
我的客户希望在程序的桌面快捷方式的文件名中看到一些“版本号”。例如:\"Foobar 10.lnk\" 或 \"Foobar 12.lnk\"。
因此,我们的 .WXS 文件之一中有以下 sn-p:
<DirectoryRef Id=\"DesktopFolder\">
<Component Id=\"...\" Guid=\"...\">
<Shortcut Id=\"....\" Name=\"Foobar_10\" ... />
<RegistryValue ... />
</Component>
</DirectoryRef>
每次发布新版本时,我们都会更新该 .WXS 文件。在我们生产时,这个方案没有问题重大升级,因为我们的重大升级先卸载现有产品,然后再安装新版本。
但是现在我们必须发布一个小升级.并将\"Foobar 10.1.lnk\" 文件放入\"Desktop\" 目录。因此,我们有一个版本 10 的 MSI 文件,另一个版本 10.1 的 MSI 文件和用于将产品从版本 10 升级到版本 10.1 的 MSP 补丁。
根据Changing the Product Code,使用小升级添加或删除新快捷方式是合法的:
更新可以添加、删除或修改不被两个或多个功能共享的组件的...快捷方式。 ...如果更新删除了资源,它还应该更新 RemoveFile 和 RemoveRegistry 表以删除任何未使用的文件、注册表项或已安装的快捷方式。
如果我们使用上面的快捷方式 sn-p 安装 MSP 文件,我们最终会在 \"Desktop\" 目录中得到两个快捷方式:Foobar_10.lnk 和 Foobar_10.1.lnk,因为转换应用于
Shortcut表。因此,根据我已经提到的文章,我们必须更新RemoveFile表:<DirectoryRef Id=\"DesktopFolder\"> <Component Id=\"...\" Guid=\"...\"> <Shortcut Id=\"....\" Name=\"Foobar_10.1\" ... /> <RemoveFile Id=\"...\" Name=\"Foobar_10.lnk\" On=\"install\" /> <RegistryValue ... /> </Component> </DirectoryRef>现在,如果将那个 MSP 文件安装到已经安装的 ``Foobar version 10\'\' 上,他/她会在 \"Desktop\" 目录中获得单个 .LNK 文件——Foobar_10.1.lnk。
到目前为止,一切都很好。
但是,如果使用系统的“控制面板”删除该次要升级(因此,只进行次要升级,恢复到“Foobar 版本 10”),他/她将再次获得两个快捷方式:Foobar_10。 1.lnk \"remained\" 来自 MSI+MSP,Foobar_10.lnk 由转换后的
Shortcut表中的CreateShortcuts操作创建。我的主要问题是: 卸载 MSP 次要升级时如何删除文件 Foobar_10.1.lnk?我应该“检查”哪些操作/属性来捕获此类卸载?
顺便说一句,我试图从卸载小升级中获取日志,但我未能使用命令行卸载升级。例如,这个:
msiexec -uninstall {valid-patch-guid-here} -package foobar.msi以“foobar.msi”的维护模式结束。以下两个命令:
msiexec /I {valid-product-code-guid} MSIPATCHREMOVE={valid-patch-guid} msiexec -package {valid-product-code-guid} -uninstall {valid-patch-guid}给出相同的(这些命令来自Uninstalling Patches)。
我只能使用“控制面板”删除次要升级。因此,我无法获得卸载日志。没有它,我看不到在这个过程中会发生什么。我知道一次问两个问题是个坏主意,但可能有人知道如何使用命令行删除补丁?
谢谢。