0

我们有一个使用 Wise 构建的旧版安装程序,并且我们遇到了一些 .ASP 文件被替换为相应的 .INC 文件以处理安全问题的情况;因此,在升级过程中,必须删除那些旧的 .ASP 文件。它在其中一个目录中工作,但在其他两个目录中,旧的 .ASP 文件在升级后仍然存在。

对于网站中的所有目录,有一个 RemoveFile 条目告诉安装程序在卸载期间删除所有文件,所以我认为这足以让安装程序删除那些旧文件,但显然不是。

为了解决这个问题,我添加了 RemoveFile 条目,这些条目在安装时删除了特定文件并再次尝试升级,但即使这样也不起作用。

没有编写自定义操作来删除这些文件,有没有人对如何让它工作有任何想法?

4

2 回答 2

0

在 Windows Installer 中,一切都与组件 guid 有关。如果您安装了 10 个文件,它们都将具有唯一的组件 guid。如果您对不再需要其中五个文件并替换其他五个文件的产品进行重大升级,那么显然您不会将旧文件放入升级中,而且您还添加了带有五个新组件 guid 的这五个新文件。换句话说,这些症状表明您添加了新文件但保留了现有的组件 guid。重大升级包括卸载旧产品,但使用相同的组件 guid 会导致 guid 的引用计数永远不会变为零,从而导致这些组件(以及文件)被卸载。

此外,如果组件曾经被标记为永久或文件曾经被标记为共享,那么文件将不会被删除。将组件标记为永久会将其粘贴到系统上,因此重建 MSI 并将其标记为非永久不会修复它。该组件有一个额外的记录计数。当一个文件被明确标记为共享时,这意味着它可以通过非 MSI 安装进行安装(并且不会被组件 guid 引用计数),因此注册表中的 SharedDlls 中会有一个条目,因为 MSI 被告知还有另一个非 MSI 客户端。可以在注册表中查看 SharedDlls 以查看是否发生了这种情况。组件的引用计数更难发现,但详细的升级日志会有所帮助。此 VB 脚本将显示所有已安装的组件和正在使用它们的产品:

选项显式
公共安装程序、fullmsg、comp、a、prod、fso、pname、ploc、pid、psorce

设置 fso = CreateObject("Scripting.FileSystemObject") 设置 a = fso.CreateTextFile("comps.txt", True)

' 连接到 Windows Installer 对象 设置安装程序 = CreateObject("WindowsInstaller.Installer") a.writeline(“MSI 组件”) 错误继续下一步 对于安装程序中的每个组件。 a.writeline (comp & " 被产品使用:") 对于 Installer.ComponentClients (comp) 中的每个产品 pid = installer.componentpath (prod, comp) pname = installer.productinfo (prod, "InstalledProductName") a.Writeline(""&pname&""&prod&"并安装在"&pid) 下一个 下一个

enter code here
于 2016-06-23T21:59:00.330 回答
0

事实证明,我的问题与 MSI 无关。安装中的一个自定义操作是备份所有网站文件,以便在升级后期通过另一个自定义操作恢复它们,这导致我们想要删除的大多数 .ASP 文件被放置回到原来的 .ASP 文件似乎已被删除的目录中,这是因为该目录被隐藏了,因此没有备份,因此也没有恢复。在备份和恢复之间,MSI 实际上在完成它的工作,并在安装新内容之前从旧版本中删除所有内容。(向您展示我已经离开那个我忘记正在发生的项目多久了。:-()

于 2016-06-28T00:01:59.650 回答