Jason Cohen
Jason Cohen

Reputation: 83021

How do I add/update a property inside an MSI from the command-line?

I have an MSI installer in which I need to add or modify a short text property from the command-line.

This has to be done after the installer is built; I cannot modify the process that produces the installer in the first place. It also has to be executed headless from a script.

When I say "property," it could be an MSI property, a value that gets written to the registery at install-time, or any other mechanism that can get this short custom text into the installed application when it runs.

Upvotes: 11

Views: 27180

Answers (3)

saschabeaumont
saschabeaumont

Reputation: 22406

Example VBScript that you could use to update (or add) a property post-build...

    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

For more information check out the Windows Installer SDK (part of the Windows SDK)

There's a bunch of example scripts that you can use from the command line to do various MSI manipulation tasks

For example WiRunSQL.vbs lets you execute arbitrary SQL against an MSI.

Upvotes: 14

asarenski
asarenski

Reputation: 46

This is to add to @saschabeaumont 's answer in '09. Currently using 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

Upvotes: 1

ZippyV
ZippyV

Reputation: 13028

c:\> msiexec /i yourmsi.msi THEPROPERTYNAME=valueofproperty

For more information type msiexec at the commandline.

EDIT: or change the .msi file itself by using sql statements and updating the property in the properties table: http://msdn.microsoft.com/en-us/library/aa372021(VS.85).aspx http://msdn.microsoft.com/en-us/library/aa368568(VS.85).aspx

Upvotes: 6

Related Questions