如何从 vbscript 获取 MST 属性
How to get MST properties from vbscript
因此,我正在创建一个将读取 MSI 和 MST 文件的 vbscript。这个想法是,如果将 运行 该脚本的用户正在测试一个涉及 MST 文件的 MSI,则该脚本应该创建一个 "report" 该 MST 具有的新属性。
我能够从常规 MSI 获取属性,问题是当我试图进入 MST 部分时。在进行研究时,我发现了 _TransformView Table,这应该可以帮助我获取此信息,但我想我不确定我是否知道如何处理 table。
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 Table 但不确定如何获取此信息!欢迎您分享任何知识。
WiLstXfm.vbs:您是否熟悉 MSI SDK 示例:wilstxfm.vbs
(查看转换) ?它可用于查看转换文件。用法如下:
cscript.exe WiLstXfm.vbs MySetup.msi MySetup.mst
Mock-up 输出:
Property Value [INSTALLLEVEL] {100}->{102}
File DELETE [Help.chm]
我想你需要的都在里面吧?也许快速看一下。有一大堆这样的 MSI API Samples - 用于各种 MSI 目的。
Github.com / Windows SDK:这些 VBScripts 与 Windows SDK 一起安装, 因此如果您安装了 Visual Studio,您可以在本地磁盘上找到它们,但您也可以在 Github.com:
上找到它们
- Github: WiLstXfm.vbs - Microsoft repository on github.com.
- 磁盘:在您的本地磁盘上,在
Program Files (x86)
下搜索如果您已安装 Visual Studio。当前示例:%ProgramFiles(x86)%\Windows Kits\bin.0.17763.0\x86
.
它的工作原理与您的想法略有不同。 运行 下面看看我的意思(如果您期望大量输出,可以在命令提示符下使用 Cscript.exe 强制 VBS 运行):
'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
因此,如果您只想查看 属性 table 中的更改,您可以将 SQL 查询更改为:
Dim sql : sql = "SELECT * FROM `_TransformView` WHERE `Table` = 'Property'"
除了存储已更改条目的列名外,“_TransformView”table 中的 'Column' 列还通过使用以下值存储值是否被插入、删除等:
插入、删除、创建或删除。
您可以找到很多 VBScript Windows Installer tutorials for reference - don't forget to set your objects to Nothing otherwise you'll leave handles open. And of course use the link you provided 供进一步参考。
因此,我正在创建一个将读取 MSI 和 MST 文件的 vbscript。这个想法是,如果将 运行 该脚本的用户正在测试一个涉及 MST 文件的 MSI,则该脚本应该创建一个 "report" 该 MST 具有的新属性。
我能够从常规 MSI 获取属性,问题是当我试图进入 MST 部分时。在进行研究时,我发现了 _TransformView Table,这应该可以帮助我获取此信息,但我想我不确定我是否知道如何处理 table。
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 Table 但不确定如何获取此信息!欢迎您分享任何知识。
WiLstXfm.vbs:您是否熟悉 MSI SDK 示例:wilstxfm.vbs
(查看转换) ?它可用于查看转换文件。用法如下:
cscript.exe WiLstXfm.vbs MySetup.msi MySetup.mst
Mock-up 输出:
Property Value [INSTALLLEVEL] {100}->{102}
File DELETE [Help.chm]
我想你需要的都在里面吧?也许快速看一下。有一大堆这样的 MSI API Samples - 用于各种 MSI 目的。
Github.com / Windows SDK:这些 VBScripts 与 Windows SDK 一起安装, 因此如果您安装了 Visual Studio,您可以在本地磁盘上找到它们,但您也可以在 Github.com:
上找到它们- Github: WiLstXfm.vbs - Microsoft repository on github.com.
- 磁盘:在您的本地磁盘上,在
Program Files (x86)
下搜索如果您已安装 Visual Studio。当前示例:%ProgramFiles(x86)%\Windows Kits\bin.0.17763.0\x86
.
它的工作原理与您的想法略有不同。 运行 下面看看我的意思(如果您期望大量输出,可以在命令提示符下使用 Cscript.exe 强制 VBS 运行):
'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
因此,如果您只想查看 属性 table 中的更改,您可以将 SQL 查询更改为:
Dim sql : sql = "SELECT * FROM `_TransformView` WHERE `Table` = 'Property'"
除了存储已更改条目的列名外,“_TransformView”table 中的 'Column' 列还通过使用以下值存储值是否被插入、删除等: 插入、删除、创建或删除。
您可以找到很多 VBScript Windows Installer tutorials for reference - don't forget to set your objects to Nothing otherwise you'll leave handles open. And of course use the link you provided 供进一步参考。