0

我正在尝试自动化一个过程,以在编译时更新一个 wise for windows 包,以更新产品代码、包代码、产品版本和更新表 versionmax 值。

我可以成功更新包代码的属性表和摘要信息。但是,更新表给我带来了问题。此表中有几个条目。

我可以枚举现有条目,但无法更新现有条目。每次我尝试得到一个错误“异常:需要对象'project.WTables(...).WRows.Row(...)'

我使用的语法与前面更新 ProductCode、ProductVersion 和包代码的调用相同。

我正在使用 vbscript。

我正在传递产品版本和 wise wsi 项目文件的完整路径。在 UpdateUpgradeTable 函数中,aUpgradeGuids 按照我的预期正确填充了一组升级代码。我现在要做的就是将每个代码的 VersionMax 值更改为当前的 wiseProductVersion。但是,vbscript 对象 WRows.Row(a(i)) 似乎存在一些问题,这是一个实际的 GUID。

我在帮助的自动化部分查看了其他示例脚本,它确实支持使用变量,而且看起来变量不像纯文本那样需要引号。我什至不确定这意味着什么,需要对象。项目绝对是一个对象。我已经确认了。我什至通过在函数中插入直接文本来尝试过这个,但它仍然失败。我已经用 tblProperty.WRows.Row(...) 尝试过,但它以同样的方式失败。在 Set tblProperty = ... 之后,我尝试在 For 循环之外用一个好的升级代码调用它,但它仍然失败。这种类型的结构适用于所有以前的表格。这让我很困惑。有任何想法吗?我认为这可能超越了 Wise for Windows 并且可能对 msi 也是通用的,所以我也将在 MSI 下发布。

我有一个看起来像这样的子主:

Dim wiseInstallDir: wiseInstallDir = WScript.Arguments(0)
Dim wiseProductVersion: wiseProductVersion = WScript.Arguments(1)

Sub main()
    Set wise = CreateObject("WfWi.Document")
    Dim nResult
    nResult = wise.Open (wiseInstallDir)
    UpdateProductVersion wise
    ... 'other functions 
    UpdateUpgradeTable wise
    wise.Save wiseInstallDir
End Sub


'This function works properly 
Sub UpdateProductVersion(project)
    Set tblProperty = project.WTables("Property")
    tblProperty.WRows.Row("ProductVersion").WColumns("Value").Data=wiseProductVersion

End Sub  

Sub UpdateUpgradeTable(project)
    Set tblProperty = project.WTables("Upgrade")
    Dim tmpRow,count: count = 0
    Dim aUpgradeGuids: Set aUpgradeGuids = CreateObject("Scripting.Dictionary")
    Const UPGRADECODE = 0

   For Each tmpRow In tblProperty.WRows
       Dim tRow: tRow=tmpRow.Key
       Dim values: values=Split(tRow, ",")
       aUpgradeGuids.Add count,values(0) 
       count=count + 1
   Next
   a = aUpgradeGuids.Items
   For i = 0 To aUpgradeGuids.Count - 1
       project.WTables("Upgrade")._
       WRows.Row(a(i)).WColumns("VersionMax").Data=wiseProductVersion
   Next

End Sub

main

编辑:'更新了 UpdateUpgradeTable

Sub UpdateUpgradeTable(project)
    Set tblProperty = project.WTables("Upgrade")
    Dim tmpRow  
    'Get the UpgradeCode for each current record and change the VersionMax value for that record. 
    For Each tmpRow In tblProperty.WRows
        Dim tRow: tRow=tmpRow.Key
        Dim values: values=Split(tRow, ",")
        tblProperty.WRows.Row(values(0)).WColumns("VersionMax").Data=wiseProductVersion
    Next


End Sub
4

1 回答 1

0

我想我知道答案。我仍然没有让它 100% 工作,但我找到了 Row 方法的附加文档,说明具有多个键列的表,逗号分隔键值。我已经插入了value(0), value(1), ... 但我现在遇到了一个不同的错误。一旦我得到这个工作,我会更新。

升级表有 5 个主键值。

<!-- language: lang-vbs -->

    Set rows = tblProperty.WRows
    Set row = tblProperty.WRows.Row(values(UPGRADECODE), values(VERSIONMIN), values(VERSIONMAX), values(LANGUAGE), values(ATTRIBUTES))
    tblProperty.WRows.Row(values(UPGRADECODE),values(VERSIONMIN),values(VERSIONMAX),values(LANGUAGE),values(ATTRIBUTES)).WColumns("VersionMax").Data=wiseProductVersion

请注意,第一个Set rows=...返回一个有效对象及其相应的方法。第二行失败并显示以下消息:

例外:参数数量错误或属性分配无效:'tblProperty.WRows.Row'

以下是升级表的 5 个主键。

  1. 值(升级代码)

  2. 值 (VERSIONMIN)

  3. 值 (VERSIONMAX)

  4. 值(语言)

  5. 值(属性)

还有其他方法可以更新升级表吗?有什么我想念的吗?

根据文档,WRows 对象是 WTable 的子对象。它为我返回了一个有效的对象。它有以下方法:

WRow Row(BSTR strKeyValue):返回一个给定其键值的 WRow。对于具有多个键列的表,逗号分隔键值。
Row() 是默认方法。

但是,我上面的逗号分隔键值构造失败了,我不知道现在该转向哪里。有没有人曾经使用过这个并让它工作?

于 2013-08-27T14:57:20.970 回答