【问题标题】:How to set variables using existing xml file in installShield 2010如何在 installShield 2010 中使用现有 xml 文件设置变量
【发布时间】:2011-11-15 23:42:12
【问题描述】:

我在 InstallShield 2010 中使用 Basic MSI Project 构建了一个安装程序。

我的设置有自定义对话框,其中包含文本框等输入。每个 TextBox 都将一个变量与一个默认值相关联。软件包工具包还包含一个由安装程序生成的 .xml 文件,其中包含向导中在特定路径中设置的值。效果很好。

问题是我有很多这个文本框和很多步骤。我想增加用户在向导的一个步骤中浏览 .xml 文件的可能性,然后跳过所有在文本框中插入数据的步骤。

我猜在我的安装程序项目中,我必须为每个变量设置一个值或一个路径(我确切地知道我需要的值在 xml 中的位置),条件是用户指向一个 xml。

如果浏览的xml没有我需要的相同模板,我暂时忽略,假设我会找到路径。

问题是我如何在我的项目中设置变量以防xml文件被浏览?

最新编辑:

我的 xml 看起来像:

<Settings>
    <SiteNames>
        <Setting property="prop1">value1</Setting>
        <Setting property="prop2">value2</Setting>
    </SiteNames>
</Settings>

我的 .js 是:

function setValues(){
    var xmlPath = Session.Property("IS_BROWSE_FILEBROWSED");
    var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");

    xmlDoc.async = "false";
    xmlDoc.load(xmlPath);

    var elem = xmlDoc.getElementsByTagName("Setting");
    for (var i=0; i<elem.length; i++){
        Session.Property(elem[i].getAttribute("property")) = elem[i].childNodes[0].nodeValue);
    }
}

有什么问题吗?我的属性值没有改变..

按下按钮时脚本正在运行。我不知道我必须做什么才能让它工作。

感谢您的宝贵时间。

【问题讨论】:

    标签: installshield


    【解决方案1】:

    您需要一个可以使用 XML DOM 读取 XML 文件并调用 MsiSetProperty() 来设置各种属性的自定义操作。

    例如:

    <Settings>
      <Setting Id="SOMEPROP1">SOMEVALUE</Setting>
      <Setting Id="SOMEPROP2">SOMEVALUE</Setting>
    </Setting>
    

    那只是(伪代码)的问题

    for each Setting element in Settings
      MsiSetProperty( setting.ID, setting.InnerText )
    next
    

    此外,MSI 的内部本机 UI 只有目录浏览器而不是文件浏览器控件,因此您要么必须保持文件名不变并浏览目录,要么也将文件选择控件用于您的自定义操作。

    【讨论】:

    • 你说 SOMEVALUESOMEVALUE 是我的 xml 文件吗?在我的自定义操作中,我必须为每个设置添加.....?我应该在哪里写 xml 和我的自定义操作之间的链接?我应该选择什么类型的自定义操作?是关于设置属性的吗?
    • 自定义操作的类型取决于您编写的内容。您可以使用 InstallScript、C++、VBScript、C# 等编写。当您实现文件选择对话框时,您必须将该文件路径传递给您的 XML 文档对象模型,然后该模型将用于查询设置元素。在 InstallScript 和 C++ 中您将使用 MsiSetProperty(hMSI, PROPNAME, PROPVALUE),在 VBScript 中您将使用 Session.Property(PROPNAME)=PROPVALUE 而在 C#(DTF) 中它是 Session[PROPNAME]=PROPVALUE
    • 我不会处理它...我现在没有写另一个自定义操作,而不是午餐一个 exe 文件。我不知道应该在脚本中包含哪些库或应该使用哪些函数。我应该通过参数发送xml的路径吗?很抱歉,你能给我一个更具体的例子吗?
    • 我提到我用文件浏览器创建了一个对话框。对于那些需要它的人,这里是步骤的链接:kb.flexerasoftware.com/doc/Helpnet/installshield16helplib_sp1/…
    【解决方案2】:

    我放弃了 jscript 功能..它不起作用..我不知道为什么。

    我使用 vbScript 代替(这是我第一次 :) 我使用 vbscripts)

    Dim xmlPath  
    Dim xmlDoc
    xmlPath = Session.Property("IS_BROWSE_FILEBROWSED")
    set xmlDoc = CreateObject("Microsoft.XMLDOM")
    
    xmlDoc.async = "false"
    xmlDoc.load(xmlPath)    
    
    for each x in xmlDoc.getElementsByTagName("Setting")           
        Session.Property(x.getAttribute("property")) = x.text
    next
    

    效果很好! 感谢您指导我 Christipher Painter!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      相关资源
      最近更新 更多