Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何从命令行在MSI中添加/更新属性?_Windows_Command Line_Installation_Windows Installer_Properties - Fatal编程技术网

Windows 如何从命令行在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 编辑:或通过使用

我有一个MSI安装程序,需要在其中从命令行添加或修改短文本属性

这必须在安装程序建成后进行;我无法首先修改生成安装程序的过程。它还必须从脚本中无头执行

当我说“property”时,它可能是一个MSI属性,一个在安装时写入注册表的值,或者任何其他机制,可以在安装的应用程序运行时将这个简短的自定义文本写入其中

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()