因此,我正在创建一个vbscript,它将读取MSI和MST文件。这个想法是,如果将要运行脚本的用户正在测试包含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表,但是不确定如何获取此信息!您可以分享的任何知识都将受到欢迎。
答案 0 :(得分:0)
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上找到它们:
Program Files (x86)
下搜索。当前示例: %ProgramFiles(x86)%\Windows Kits\10\bin\10.0.17763.0\x86
。答案 1 :(得分:0)
它的工作原理与您的想法略有不同。运行以下命令,以了解我的意思(如果期望大量输出,则可以从命令提示符强制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”表中的“列”列还存储是否通过使用以下值插入,删除了该值: 插入,删除,创建或删除。
您可以找到许多VBScript Windows Installer tutorials供参考-不要忘记将对象设置为Nothing,否则将使句柄保持打开状态。当然,请使用link you provided作为参考。