首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从vbscript获取MST属性

如何从vbscript获取MST属性
EN

Stack Overflow用户
提问于 2019-05-28 04:26:36
回答 1查看 439关注 0票数 1

因此,我正在创建一个vbscript,它将读取MSI和MST文件。其想法是,如果将运行脚本的用户正在测试包含MST文件的MSI,则脚本应创建此MST具有的新属性的“报告”。

我可以从常规的MSI中获取属性,问题是当我试图进入MST部分时。在做研究的时候,我发现了_TransformView表,这应该有助于我获得这些信息,但我想我不确定我知道如何处理这个表。

代码语言:javascript
复制
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表,但不确定如何获得此信息!欢迎分享任何你能分享的知识。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-28 18:29:37

它的工作原理与你所想的略有不同。运行以下命令来理解我的意思(如果您希望获得大量输出,可以在命令提示符下强制使用Cscript.exe运行VBS ):

代码语言:javascript
复制
'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查询更改为:

代码语言:javascript
复制
Dim sql : sql = "SELECT * FROM `_TransformView` WHERE `Table` = 'Property'"

除了存储已更改条目的列名之外,'_TransformView‘表中的' column’列还通过使用以下值来存储值是否已插入、删除等: INSERT、DELETE、CREATE或DROP。

你可以找到很多可供参考的VBScript Windows Installer tutorials --别忘了把你的对象设置为空,否则你会让句柄打开的。当然,还可以使用link you provided作为进一步的参考。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56332116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档