Windows 如何从命令行在MSI中添加/更新属性?
我有一个MSI安装程序,需要在其中从命令行添加或修改短文本属性 这必须在安装程序建成后进行;我无法首先修改生成安装程序的过程。它还必须从脚本中无头执行 当我说“property”时,它可能是一个MSI属性,一个在安装时写入注册表的值,或者任何其他机制,可以在安装的应用程序运行时将这个简短的自定义文本写入其中Windows 如何从命令行在MSI中添加/更新属性?,windows,command-line,installation,windows-installer,properties,Windows,Command Line,Installation,Windows Installer,Properties,我有一个MSI安装程序,需要在其中从命令行添加或修改短文本属性 这必须在安装程序建成后进行;我无法首先修改生成安装程序的过程。它还必须从脚本中无头执行 当我说“property”时,它可能是一个MSI属性,一个在安装时写入注册表的值,或者任何其他机制,可以在安装的应用程序运行时将这个简短的自定义文本写入其中 c:\> msiexec /i yourmsi.msi THEPROPERTYNAME=valueofproperty 有关详细信息,请在命令行中键入msiexec 编辑:或通过使用
c:\> msiexec /i yourmsi.msi THEPROPERTYNAME=valueofproperty
有关详细信息,请在命令行中键入msiexec
编辑:或通过使用sql语句并更新属性表中的属性来更改.msi文件本身:
可用于在生成后更新(或添加)属性的VBScript示例
选项显式
Const MSI_FILE=“myfile.MSI”
Dim安装程序、数据库、视图
设置installer=CreateObject(“WindowsInstaller.installer”)
Set database=installer.OpenDatabase(MSI_文件,1)
"更新"
Set view=database.OpenView(“更新属性集值=”&myproperty&“其中属性='myproperty'))
' .. 或添加(插入)
Set view=database.OpenView(“插入到属性(属性,值)值('MYPROPERTY','“&MYPROPERTY&'”)中”)
查看。执行
提交数据库
设置数据库=无
设置安装程序=无
设置视图=无
有关更多信息,请查看Windows Installer SDK(部分)
有许多示例脚本,您可以从命令行使用它们来执行各种MSI操作任务
例如,
WiRunSQL.vbs
允许您对MSI执行任意SQL。这将添加到@saschabeaumont在'09年的回答中。目前正在使用dotNet 4.0
Option Explicit
Const MSI_FILE = "myFilePath.msi"
Const PROPERTY_STRING_Value = "FooBar"
Dim installer, database, view
Set installer = CreateObject("WindowsInstaller.Installer")
Set database = installer.OpenDatabase (MSI_FILE, 1)
' Update
Set view = database.OpenView ("UPDATE Property SET Value = '" & PROPERTY_STRING_Value & "' WHERE Property = 'MYPROPERTY'")
' .. or Add (Insert)
Set view = database.OpenView ("INSERT INTO Property (Property, Value) VALUES ('MYPROPERTY', '" & PROPERTY_STRING_Value & "')")
view.Execute()
database.Commit()
Set database = Nothing
Set installer = Nothing
Set view = Nothing
我认为这是一个新的安装属性。我不想安装,我需要修改MSI文件。我认为这不值得否决,因为这符合OP的问题指定的标准。Post build是一个MSI属性,当然是“任何其他机制,可以在安装的应用程序运行时将此简短的自定义文本放入其中。”它不会改变MSI本身,但是在安装程序的运行时执行此操作实际上是相同的结果。当您更改包时,不要忘记更新摘要信息流中的包代码。虽然更改属性值不太可能导致实际问题,即使您发布了多个具有不同值的.msi文件,但这仍然是您需要执行的操作。我只发现在创建转换时需要更新摘要信息,有什么原因需要为所有更改进行更新吗?我甚至不能用这个脚本更新变量,并得到一个运行时错误“variable is undefined”。我已签入Orca,该属性已定义。我知道这是旧的,但已修改为添加database.Commit。不知怎的,@asarenski发布的最新一个有效,但saschabeaumont发布的前一个在msi中没有更改+1这是因为@saschabeaumont忘记添加
database.Commit()