使用Wix安装后删除目录和文件

5

在安装过程中,我需要一些额外的文件来进行自定义操作,这些操作被配置在InstallExecuteSequence标签中的After="InstallFinalize"之后。

在使用这些文件之后,我想要删除这些文件(以及目录)。

我该如何做到这一点?

我的InstallExecuteSequence看起来像这样:

  <InstallExecuteSequence>
     <Custom Action="UNINSTALLSERVICE"
             After="InstallInitialize">REMOVE="ALL"</Custom>
     <Custom Action="CLEANUP"
             Before="RemoveFiles">REMOVE="ALL"</Custom>
     <Custom Action="INSTALLSERVICE"
             After="InstallFinalize" />
  </InstallExecuteSequence>

如果我使用“自定义操作”创建一个操作
ExeCommand="cmd /C RD "somedir" /s /q"

将其添加到序列中,如下所示:
 <Custom Action="CLEANTEMP" After="InstallFinalize" />

我遇到了一个构建错误:
Error   596 ICE77: CLEANCONFIG is a in-script custom action.  
It must be sequenced in between the InstallInitialize action 
and the InstallFinalize action in the InstallExecuteSequence table

1
安装过程中的临时文件是一种“部署异味”。这些文件在做什么?可能有更好的方法,对你来说会更简单。 - Stein Åsmul
如果您不知道,WiX可以创建Windows Installer软件包。(WiX并不涉及实际安装过程。)您应该研究Windows Installer的设计原则。 - Tom Blodget
临时文件用于根据安装它们的服务器配置配置文件。该设置在我们的DTAP环境中使用,并用于自动安装到具有不同配置文件的不同机器上。 DTAP环境中所有服务器的所有配置文件都包含在设置中。根据服务器名称,有些被使用,有些则不是。在安装结束时,我不再需要所有配置文件,并希望删除该目录。 - Dennis
我并不是说我的解决方案是最好的,但(抱歉这么说),我并不是在问我做的是否有错(也许在你看来我完全是愚蠢地这样做),我只是在问如何在安装后删除一个带内容的目录。 - Dennis
2个回答

1
更新: 不确定为什么刚才会被投票否决。下面的总结是有价值的建议。 也许缺少示例?我会添加一些链接。另外,可能会有需要自定义动作来调整服务安装的情况,但如果您正确设计了服务,则很少需要这样做- WiX还有构造帮助您进行常见的微调:
通常情况下,没有必要使用自定义操作来安装和配置服务。由于其完全回滚支持和广泛的功能集,内置的MSI功能在这方面要优越得多。使用自定义操作会极大地复杂化事情,增加不必要的风险,并且在回滚期间几乎总是会失败,导致系统处于无效状态。

MSI表格有一个学习曲线 - 有很多选项,但根据我的经验,只有少数一起合理的设置包。通常在安装期间停止和重新启动,在卸载期间停止和删除以及这些变化。过去,我添加自定义操作只是为了等待服务正常关闭,但那只是等待自定义操作,不会改变系统。可能有新的Wix功能适用于这种场景,我不知道。

MSI表ServiceInstallServiceControl用于安装服务。在Wix中,您需要处理等效的XML元素:Wix ServiceInstallWix ServiceControl以及更新的Wix ServiceConfigWix ServiceConfigFailureActions


Glytzhof,我的问题不是关于安装/卸载服务,而是关于在安装过程中删除一些我需要的文件(无需深入解释为什么我需要它们,我只是需要)。我只想在设置期间删除一些我需要的文件,但在安装后不删除。 - Dennis

1

您似乎设置的方式存在许多问题:

  • 安装完成后自定义操作不能更改系统,也无法以管理员权限运行。此外,您将自定义操作设置为延迟模式,但这只允许在InstallInitialize和InstallFinalize之间使用——这就是您提到的错误信息的原因。
  • 有些人在InstallFinalize之后使用即时模式的自定义操作。这从定义上来说总是错误的,只有整个安装过程都以管理员权限运行才能正常工作。即使如此,在公司世界中使用SCCM或其他软件分发系统时,它也经常会失败。
  • 在安装过程中使用临时文件通常是不可取的。正如我之前所评论的,“部署气味”。某些用途是可以接受的,例如显示标志和许可协议,但这些也往往被编译到安装程序中,并自动删除。
  • 作为安装的一部分运行批处理文件非常不可靠和容易出错,并且可能对系统进行更改,如果安装过程失败,则无法回滚。
RemoveFile tableWix equivalent)可以让您在安装、卸载或两者同时进行时删除文件。您不应该删除属于相关Windows Installer组件的文件,因为自我修复可能会将它们放回去。
我认为您需要的是:
  1. 严肃重新考虑您使用批处理文件和临时文件的方式。很可能它们带来的麻烦比价值更大。
  2. 充分了解提升权限、Windows Installer 的安全模型以及立即模式(用户权限)和延迟模式(提升权限)自定义操作之间的区别。这是一篇好的文章,由一个公认的MSI专家撰写。更新于2021-09-04:原始链接似乎已失效。这是通过Archive.org获取的链接

谢谢Glytzhkof。我完全理解你的意思,也完全同意你的观点。所以我要告诉所有Wix用户不要像我这样使用设置。但在我的情况下,设置是DTAP环境的一部分,并且是在我们域内运行的完全自动化服务的一部分。设置不会被发送给客户等等,它们只由我维护。而且安装是完全受监控的。所以一方面我同意你的观点,另一方面,我想在安装完成后删除一些文件。 - Dennis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接