【问题标题】:How do I add/update a property inside an MSI from the command-line?如何从命令行添加/更新 MSI 内的属性?
【发布时间】:2009-10-22 18:51:07
【问题描述】:

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

这必须在安装程序构建后完成;我一开始就无法修改生成安装程序的过程。它还必须从脚本中无头执行。

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

【问题讨论】:

    标签: windows command-line installation windows-installer properties


    【解决方案1】:

    可用于在构建后更新(或添加)属性的示例 VBScript...

        Option Explicit
    
        Const MSI_FILE = "myfile.msi"
    
    
        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 = '" & myproperty & "' WHERE Property = 'MYPROPERTY'")
    
        ' .. or Add (Insert)
        Set view = database.OpenView ("INSERT INTO Property (Property, Value) VALUES ('MYPROPERTY', '" & myproperty & "')")
        view.Execute
        database.Commit
    
        Set database = Nothing
        Set installer = Nothing
        Set view = Nothing
    

    有关详细信息,请查看 Windows Installer SDK(Windows SDK 的一部分)

    您可以从命令行使用大量示例脚本来执行各种 MSI 操作任务

    例如,WiRunSQL.vbs 允许您针对 MSI 执行任意 SQL。

    【讨论】:

    • 更改包时不要忘记更新摘要信息流中的包代码。尽管即使您发布了多个具有不同值的 .msi 文件,更改属性值也不太可能导致实际问题,但这仍然是您需要做的事情。
    • 我只发现我需要在创建转换时更新摘要信息,为什么您需要更新所有更改?
    • 我什至无法使用此脚本更新变量并收到运行时错误“变量未定义”。我已经在 Orca 中检查了该属性已定义。
    • 我知道这是旧的但修改为添加 database.Commit。
    【解决方案2】:
    c:\> msiexec /i yourmsi.msi THEPROPERTYNAME=valueofproperty
    

    有关更多信息,请在命令行中键入 msiexec。

    编辑:或通过使用 sql 语句并更新属性表中的属性来更改 .msi 文件本身: http://msdn.microsoft.com/en-us/library/aa372021(VS.85).aspx http://msdn.microsoft.com/en-us/library/aa368568(VS.85).aspx

    【讨论】:

    • 我认为安装一个新属性。我不想安装,我需要修改 MSI 文件。
    • 我认为这不值得投反对票,因为这符合 OP 问题指定的标准。 Post-build 是 MSI 的属性,当然是“任何其他可以在运行时将这个简短的自定义文本放入已安装的应用程序的机制”。它不会改变 MSI 本身,但在安装程序的运行时执行此操作实际上是相同的结果。
    【解决方案3】:

    这是在 09 年添加到 @saschabeaumont 的答案。目前使用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
    

    【讨论】:

    • 不知何故,@asarenski 发布的最新帖子有效,但 saschabeaumont 之前发布的帖子在 msi 中没有任何变化。 +1
    • 那是因为@saschabeaumont 忘了加database.Commit()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2019-05-12
    • 2019-12-04
    • 2016-04-09
    相关资源
    最近更新 更多