如何在Javascript自定义操作中管理MSI会话状态?

时间:2011-01-10 19:13:12

标签: javascript wix windows-installer

我有一个ISAPI DLL,一个IIS的附加组件。我使用WIX 3.0为它构建安装程序。

在安装程序项目中,我在Javascript中实现了许多自定义操作。其中一个在安装启动时运行,会停止正在运行的所有IIS网站。另一个在安装结束时启动IIS网站。 这些东西有效,CA在适当的时间和适当的条件下被调用。但逻辑是天真的。它在开始时停止所有网站(即使它们已经停止)并在最后启动所有网站(即使它们之前已停止)。这显然是错误的。

我想要做的是跟踪哪些网站在开始时需要停止的会话,然后,最后,只尝试重新启动这些网站。使用CIM对象上的ServerState property可以轻松获取网站的状态。我的问题是,我应该如何在MSI会话中存储此信息?

将单个信息填充到session Property中很容易,但是存储一组N条信息的最佳方法是什么,每个网站一条信息?在某些情况下,可能有1个网站,在某些情况下,有51个网站。

我想我可以使用每个不同的网站名称来创建不同的属性名称。只是不确定这是最好,最有效,最有效的做事方式。此外,在MSI会话属性的名称中使用斜杠是否合法? (网站名称中会有斜杠)

连连呢?

2 个答案:

答案 0 :(得分:0)

您可能需要查看:

VBScript (and Jscript) MSI CustomActions suck

C ++或C#是一个更好的选择。如果您的应用程序已经依赖于框架,那么在安装程序中添加依赖项是一个很好的逻辑选择。 WiX拥有部署工具基础(DTF),它具有感觉很多jscript的自定义动作模式。然后,您可以创建网站及其运行状态的字典,并将其序列化为单个属性。在背面,您可以重建该集合,然后对其进行操作。

更不用说调试故事在DTF中要好得多。

答案 1 :(得分:0)

有一个简单的解决方案。我脑部抽筋。

我需要存储的所有项目都是字符串 - 实际上是安装期间已停止的网站名称。我只是使用Javascript String.join method来创建一个字符串,并将其填充到会话变量中。像这样:

Session.Property("CA_STOPPEDSITES") = sitesThatWereStopped.join(",");

然后在另一个自定义操作中检索该信息,我做

var stoppedSites = Session.Property("CA_STOPPEDSITES");
if (stoppedSites != null) {
    var sitesToStart = stoppedSites.split(",");
    ....

简单,轻松。