Wise Installer 在升级时不删除旧文件
Wise Installer not removing old files on upgrade
我们有一个使用 Wise 构建的遗留安装程序,并且我们遇到了一些 .ASP 文件被相应的 .INC 文件替换以处理安全问题的情况;所以在升级过程中,那些旧的 .ASP 文件必须被删除。它在其中一个目录中工作,但在其他两个目录中,旧的 .ASP 文件在升级后仍然存在。
对于网站中的所有目录,有一个 RemoveFile 条目告诉安装程序在卸载期间删除所有文件,所以我认为这足以让安装程序删除那些旧文件, 但显然不是。
为了解决这个问题,我添加了 RemoveFile 条目以删除安装时的特定文件并再次尝试升级,但即使这样也没有用。
没有编写自定义操作来删除这些文件,有没有人知道如何让它工作?
在 Windows 安装程序中,所有内容都是关于组件 guid 的。如果您安装了 10 个文件,它们都将具有唯一的组件 guid。如果您对不再需要其中五个文件并替换其他五个文件的产品进行重大升级,那么显然您不会将旧文件放入升级中,而且您还添加了这五个具有五个新组件 guid 的新文件。换句话说,症状表明您添加了新文件但保留了现有的组件 guid。主要升级包括卸载旧产品,但使用相同的组件 guid 会导致 guid 的引用计数永远不会变为零,从而导致这些组件(以及文件)被卸载。
此外,如果组件曾被标记为永久或文件曾被标记为共享,则文件将不会被删除。将组件标记为永久性会将其粘贴到系统中,因此重建 MSI 并将其标记为非永久性不会修复它。该组件有一个额外的记录计数。当一个文件被明确标记为共享时,这意味着它可以通过非 MSI 安装进行安装(并且不会被组件 guid 引用计数)因此注册表中的 SharedDlls 中会有一个条目,因为 MSI 被告知还有另一个非 MSI 客户端。可以在注册表中查看 SharedDlls 以查看是否发生了这种情况。组件的引用计数更难发现,但详细的升级日志会有所帮助。此 VB 脚本将显示所有已安装的组件和使用它们的产品:
Option Explicit
Public installer, fullmsg, comp, a, prod, fso, pname, ploc, pid, psorce
Set 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
事实证明,我的问题与 MSI 无关。安装中的自定义操作之一是备份所有网站文件,以便稍后在升级中通过另一个自定义操作恢复它们,这导致了我们想要的大部分 .ASP 文件删除以放回原处。在旧的 .ASP 文件似乎已被删除的目录中,这是因为该目录是隐藏的,因此未备份,因此未恢复。在备份和恢复之间,MSI 实际上在做它的工作,在安装新东西之前从旧版本中删除所有内容。 (向您展示了我离开那个项目多久了,我忘记了那件事正在发生。:-( )
我们有一个使用 Wise 构建的遗留安装程序,并且我们遇到了一些 .ASP 文件被相应的 .INC 文件替换以处理安全问题的情况;所以在升级过程中,那些旧的 .ASP 文件必须被删除。它在其中一个目录中工作,但在其他两个目录中,旧的 .ASP 文件在升级后仍然存在。
对于网站中的所有目录,有一个 RemoveFile 条目告诉安装程序在卸载期间删除所有文件,所以我认为这足以让安装程序删除那些旧文件, 但显然不是。
为了解决这个问题,我添加了 RemoveFile 条目以删除安装时的特定文件并再次尝试升级,但即使这样也没有用。
没有编写自定义操作来删除这些文件,有没有人知道如何让它工作?
在 Windows 安装程序中,所有内容都是关于组件 guid 的。如果您安装了 10 个文件,它们都将具有唯一的组件 guid。如果您对不再需要其中五个文件并替换其他五个文件的产品进行重大升级,那么显然您不会将旧文件放入升级中,而且您还添加了这五个具有五个新组件 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
事实证明,我的问题与 MSI 无关。安装中的自定义操作之一是备份所有网站文件,以便稍后在升级中通过另一个自定义操作恢复它们,这导致了我们想要的大部分 .ASP 文件删除以放回原处。在旧的 .ASP 文件似乎已被删除的目录中,这是因为该目录是隐藏的,因此未备份,因此未恢复。在备份和恢复之间,MSI 实际上在做它的工作,在安装新东西之前从旧版本中删除所有内容。 (向您展示了我离开那个项目多久了,我忘记了那件事正在发生。:-( )