【问题标题】:How to get MST properties from vbscript如何从 vbscript 获取 MST 属性
【发布时间】:2019-05-28 18:29:36
【问题描述】:

所以,我正在创建一个可以读取 MSI 和 MST 文件的 vbscript。这个想法是,如果将运行该脚本的用户正在测试一个涉及 MST 文件的 MSI,则该脚本应该创建一个该 MST 具有的新属性的“报告”。

我能够从常规 MSI 获取属性,但问题是当我尝试进入 MST 部分时。在进行研究时,我发现了 _TransformView 表,这应该有助于我获取这些信息,但我想我不确定我是否知道如何处理该表。

Const msiTransformErrorViewTransform = 256

Const msiOpenDB = 2

Dim FS, TS, WI, DB, View, Rec

Set WI = CreateObject("WindowsInstaller.Installer")

Set DB = WI.OpenDatabase(msiPath,msiOpenDB)

DB.ApplyTransform mstPath, msiTransformErrorViewTransform 

If Err.number Then 
    Exit Function 
End If

For i = 0 To 24 'Number of properties on the arrPropertyList

    Set View = DB.OpenView("Select `Value` From Property WHERE `Property` = " & "'" & arrPropertyList(i) & "'")
    View.Execute
    Set Rec = View.Fetch
    If Not Rec Is Nothing Then
        objLog.WriteLine arrPropertyList(i) & " = " & Rec.StringData(1)
    End If

Next

该代码将显示我在 arrPropertyList 中添加的 msi 属性。问题是我正在寻找 MST 属性,而我只得到 MSI 属性。我知道我应该在调用 DB.OpenView 时更改查询以访问 _TransformView 表,但不知道如何获得这些信息!欢迎您分享任何知识。

【问题讨论】:

    标签: vbscript windows-installer msitransform


    【解决方案1】:

    它的工作方式与您的想法略有不同。运行以下命令以了解我的意思(如果您期望大量输出,可能会强制 VBS 在命令提示符下使用 Cscript.exe 运行):

    'create 2 constants - one for when we want to just query the MSI (read) and one for when we want to make changes (write)
    
    Const msiOpenDatabaseModeReadOnly = 0
    Const msiOpenDatabaseModeTransact = 1
    Const msiTransformErrorViewTransform = 256
    
    'create WindowsInstaller.Installer object
    Dim oInstaller : Set oInstaller = CreateObject("WindowsInstaller.Installer")
    
    'open the MSI (the first argument supplied to the vbscript)
    Dim oDatabase : Set oDatabase = oInstaller.OpenDatabase("C:\Temp\Temp.msi",msiOpenDatabaseModeReadOnly) 
    
    oDatabase.ApplyTransform "C:\Temp\Temp.mst", msiTransformErrorViewTransform 
    
    'create a view of the registry we want to see
    Dim sql : sql = "SELECT * FROM `_TransformView`"
    Dim regView : Set regView = oDatabase.OpenView(sql)
    
    'execute the query
    regView.Execute 
    
    'fetch the first row of data (if there is one!)
    Dim regRecord : Set regRecord = regView.Fetch
    
    'whilst we've returned a row and therefore regRecord is not Nothing
    While Not regRecord Is Nothing
    
        'print out the registry key
        wscript.echo "Table: " & regRecord.StringData(1) 
        wscript.echo "Column: " & regRecord.StringData(2) 
        wscript.echo "Row: " & regRecord.StringData(3) 
        wscript.echo "Data: " & regRecord.StringData(4)
        wscript.echo "Current: " & regRecord.StringData(5)
        wscript.echo "***"
    
        'go and fetch the next row of data  
        Set regRecord = regView.Fetch
    Wend
    
    regView.Close
    Set regView = Nothing
    Set regRecord = Nothing
    Set oDatabase = Nothing
    Set oInstaller = Nothing
    

    因此,如果您只想查看属性表中的更改,您可以将 SQL 查询更改为:

    Dim sql : sql = "SELECT * FROM `_TransformView` WHERE `Table` = 'Property'"
    

    除了存储更改条目的列名外,“_TransformView”表中的“Column”列还使用以下值存储值是否被插入、删除等: 插入、删除、创建或删除。

    您可以找到很多 VBScript Windows Installer tutorials 以供参考 - 不要忘记将您的对象设置为 Nothing,否则您将打开句柄。当然,请使用link you provided 以供进一步参考。

    【讨论】:

    • 这帮了大忙!感谢您的意见!
    • 我使用了 "SELECT Data FROM _TransformView WHERE Row = " & "'" & arrPropertyList(i) & "'" 查询所以它会显示属性的实际值那已经改变了。您共享的查询显示属性名称,但 Value=Property 例如:ProductVersion=Property 即便如此,这还是提供了很多帮助,我非常感谢您的帮助。
    【解决方案2】:

    WiLstXfm.vbs:您是否熟悉 MSI SDK 示例:wilstxfm.vbs(查看转换)?它可用于查看转换文件。用法如下:

    cscript.exe WiLstXfm.vbs MySetup.msi MySetup.mst
    

    模型输出

    Property Value           [INSTALLLEVEL] {100}->{102}
    File DELETE              [Help.chm]
    

    我想你需要的一切都在那里?也许快速浏览一下。有一大堆这样的MSI API Samples - 用于各种 MSI 目的。

    Github.com / Windows SDK:这些 VBScript 随 Windows SDK 一起安装,因此如果您安装了 Visual Studio,您可以在本地磁盘上找到它们,但是你也可以在Github.com找到他们:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-13
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      相关资源
      最近更新 更多