我们有一个使用Wise构建的旧版安装程序,我们遇到一些情况,其中一些.ASP文件被替换为相应的.INC文件以处理安全问题;所以在升级过程中,必须删除那些旧的.ASP文件。它在其中一个目录中工作,但在其他两个目录中,旧的.ASP文件在升级后仍然存在。
对于网站中的所有目录,都有一个RemoveFile条目告诉安装程序在卸载期间删除所有文件,所以我认为这足以让安装程序删除那些旧文件,但是显然不是。
为了解决这个问题,我添加了RemoveFile条目,删除了安装时的特定文件并再次尝试升级,但即使这样也无效。
如果没有编写自定义操作来摆脱这些文件,是否有人对如何使其工作有任何想法?
答案 0 :(得分:0)
在Windows Installer中,它完全与组件guid有关。如果您安装了10个文件,则它们都具有唯一的组件指南。如果您对不再需要其中五个文件并替换其他五个文件的产品进行重大升级,那么显然您不会将旧文件放入升级中,而是添加这五个新文件和五个新组件guid。换句话说,症状表明您添加了新文件但保留了现有组件guid。主要升级包括卸载旧产品,但使用相同的组件guid会导致guid的引用计数永远不会变为零,从而导致卸载这些组件(以及文件)。
此外,如果组件曾被标记为永久性或文件曾被标记为共享,则文件将不会被删除。标记组件永久性地将其粘贴到系统上,因此重建MSI并将其标记为永久性并不能解决问题。该组件具有额外的重新计数。当文件被明确标记为共享时,意味着它可以通过非MSI安装(并且不会被组件guid引用计数)安装,因此在注册表中的SharedDlls中将有一个条目,因为MSI已被告知有另一个非MSI客户端。可以在注册表中查看SharedDlls以查看是否发生了这种情况。组件的引用计数更难发现,但升级的详细日志会有所帮助。此VB脚本将显示所有已安装的组件以及使用它们的产品:
Option Explicit Public installer, fullmsg, comp, a, prod, fso, pname, ploc, pid, psorceSet fso = CreateObject("Scripting.FileSystemObject") Set a = fso.CreateTextFile("comps.txt", True)
' Connect to Windows Installer object Set installer = CreateObject("WindowsInstaller.Installer") a.writeline ("MSI Components") on error resume next For Each comp In installer.components a.writeline (comp & " is used by the product:") for each prod in Installer.ComponentClients (comp) pid = installer.componentpath (prod, comp) pname = installer.productinfo (prod, "InstalledProductName") a.Writeline (" " & pname & " " & prod & "and is installed at " & pid) Next Next
enter code here
答案 1 :(得分:0)
事实证明我的问题与MSI无关。安装中的一个自定义操作是备份所有网站文件,以便在升级后期通过另一个自定义操作恢复它们,这导致我们要删除的大多数.ASP文件被放入在旧的.ASP文件似乎已被删除的一个目录中,原因是该目录已被隐藏,因此未备份,因此未恢复。在备份和恢复之间,MSI实际上正在执行其工作,并在安装新内容之前删除旧版本中的所有内容。 (告诉你我离开那个项目有多长时间,我忘了发生了这种情况。:-()