Reputation: 95
I want to pass custom arguments directly to the MSI installer. I have tried adding those arguments in the silentArgs but when I do that, after I run choco install I get the following (and after that the installation is aborted):
This is how I have passed those parameters in silentArgs
:
silentArgs = "/qn /norestart /l*v `"$($env:TEMP)\$($packageName).$($env:chocolateyPackageVersion).MsiInstall.log`" /CUSTOMPARAM1:'dummydata' /CUSTOMPARAM2:'dummydata'"
I have tried different syntax (instead of using :, I used = but still the same result). Then I tried choco install <pckgName> --install-arguments="CUSTOMPARAM1=""dummy.data"""
, but with this approach the package does get installed but the parameters weren't passed to the MSI installer. I searched for some kind of docs related to --install-arguments
such as the format that it expects (e.g. quotes, =
or :
, etc.) but didn't find anything.
TLDR; I want to pass custom parameters/arguments to my MSI installer through choco.
Upvotes: 3
Views: 3482
Reputation: 12561
For an installer package that is managing an MSI, you must pass arguments to the underlying installer as the installer expects to see them, for an MSI, that is UPPERCASEPROPERTY="Value" NEXTPROPERTY="Another value"
. Otherwise MSI exec will pop up like you are seeing, telling you that you are passing things to it incorrectly.
There are three approaches to this if you are creating the packaging:
I'll go through each in a bit more detail.
You were actually quite close on this. All you needed to do was change:
/CUSTOMPARAM1:'dummydata'
in
silentArgs = "/qn /norestart /l*v `"$($env:TEMP)\$($packageName).$($env:chocolateyPackageVersion).MsiInstall.log`" /CUSTOMPARAM1:'dummydata' /CUSTOMPARAM2:'dummydata'"
to:
CUSTOMPARAM1=`"dummydata`"
, such as the following (I renamed CUSTOMPARAM1
to MSIPROPERTY
below to signify that these must already exist in the MSI installer as properties you can set):
silentArgs = "/qn /norestart /l*v `"$($env:TEMP)\$($packageName).$($env:chocolateyPackageVersion).MsiInstall.log`" MSIPROPERTY=`"dummydata`" EXISTINGMSIPROPERTY2=`"dummydata`""
You could also pass in additional arguments directly to the installer at runtime.
choco install <pkgName> --install-arguments="'CUSTOMPARAM1=""dummy.data""'"
(NOTE: the quoting bits are specific to the shell you are running, cmd.exe expects these one way and powershell.exe needs them a bit different.). https://docs.chocolatey.org/en-us/choco/commands/#how-to-pass-options-switches (see Pass Quotes in Arguments) Also note this is different in that it employs the quotes bookending apostrophes as Chocolatey docs describe it ("'values'"
).
Also, if you want to override the install arguments already being passed with silentArgs instead of just appending to the end of it, you want to use an additional switch --override-arguments
. From https://docs.chocolatey.org/en-us/choco/commands/install#options-and-switches:
-o, --override, --overrideargs, --overridearguments, --override-arguments
OverrideArguments - Should install arguments be used exclusively without appending to
current package passed arguments? Defaults to false.
This is a combination of putting together package parameters in your ChocolateyInstall.ps1 and then deciding how to pass those to the silentArgs.
Based on the docs, you'll want to specify default options you would have for each parameter, then you'll look to convert that properly.
Based on https://docs.chocolatey.org/en-us/guides/create/parse-packageparameters-argument, you would set up something like this in your script:
$pp = Get-PackageParameters
$additionalArgs = ''
if ($pp['SOMEPROPERTY']) {
$additionalArgs += " MSIPROPERTYNAME=`"$($pp['SOMEPROPERTY'])`""
}
[..snip..]
silentArgs = "/qn /norestart MSIPROPERTY=`"dummydata`" $additionalArgs"
# removed /l*v args for readability/brevity
You would want to add those parameters to the description of your nuspec file. There is a specific format as outlined at https://docs.chocolatey.org/en-us/guides/create/parse-packageparameters-argument#step-2-add-package-parameters-to-the-description
And then you can call the Choco install like this:
choco install <pkgName> --package-parameters="'/SOMEPROPERTY=dummy.data'"
The benefits of Package Parameters:
Upvotes: 4
Reputation: 21428
It looks to me like you are passing the same argument in twice, once in the silent args for your package and again when calling choco install
. I think this is where the issue lies as I believe msiexec
will use the first value it finds for a given parameter. If you want to override the silent arguments, you will need to add the --override-arguments
parameter to choco install
. The downside to this approach is that this will override all of the silent args baked into the package, so you will also need provide all of the silent arguments needed to install the package.
If this is a package you developed (which it seems like it might be), I would suggest making use of package parameters instead. This way you can keep the default silent installation arguments, and in your ChocolateyInstall.ps1
you can add each CUSTOMPARAM
to -SilentArgs
passed in via a package parameter or optionally set defaults (or omit the extra parameters) for parameters that are not passed in. You can also throw errors if a require package parameter is not provided.
Upvotes: 2