msiexec does not pass parameters to custom action

action, properties, windows-installer

Solution

I've been beating my head against the wall on this one, so here's what I found out:

You have to set your parameters on the commandline, as well as on the "CustomActionData" property on each of your Custom Actions (whatever you have under Install, Commit, etc)

Your commandline will look something like this:

`msiexec /i myInstaller.msi MYFIRSTPARAM=VALUE1 MYSECONDPARAM=VALUE2`

Then, your CustomActionData should look like this:

`/myfirstparam=[MYFIRSTPARAM] /mysecondparam=[MYSECONDPARAM]`

Now, here's a bunch of special cases:

It looks like @Klaus is right, you need to use ALLCAPS in your parameter names.

if your values contain spaces, you'll need quotes around them in both the commandline and your CustomActionData properties, as in:

`msiexec /i myInstaller.msi MYFIRSTPARAM="VALUE1" MYSECONDPARAM="VALUE2"`

`/myfirstparam="[MYFIRSTPARAM]" /mysecondparam="[MYSECONDPARAM]"`

if your values end with a slash, like most file paths do, you'll have a weird problem: when the msiexec builds your customactiondata, it'll create this string:

`/myfirstparam="C:\myfile\" /mysecondparam="C:\myfile\"`

it doesn't matter if you use quotes on the commandline or not, if that slash is the last character on your value, it will effectively be read as an escape character, and will escape the quote in your customactiondata property. This causes havoc. The solution is to either 1) add a space between your parameter and the last quote, and then remember to trim() it in your code somewhere, or 2) add and extra slash between your parameter and quote, in order to escape the escape character. See both methods below:

`/myfirstparam="[MYFIRSTPARAM] " /mysecondparam="[MYSECONDPARAM]\"`

Hope that helps.

Problem

I have a custom action inside an MSI installer that makes some changes to some configuration file. my requirement is to run the installation in silent mode so I am using msiexec. Here is the command: ``` msiexec /i myInstaller.msi /l* out.txt myContextParameter=value1 ``` `myContextParameter` is never passed to the custom action so when I do `context.Parameters["myContextParameter"]` I get a `null` value. When I run my MSI in UI mode the parameter is passed correctly. I also made sure the name of the property is correctly set in the `CustomActionData`.

Original source