如何使用 Chocolatey 将安装参数直接传递给 MSI 安装程序(如 PowerShell 中的 -ArgumentLIist)?

How to pass installation arguments directly to an MSI installer (like -ArgumentLIist in PowerShell) using Chocolatey?

我想将自定义参数直接传递给 MSI 安装程序。我曾尝试在 silentArgs 中添加这些参数,但是当我这样做时,在我 运行 choco install 我得到以下信息(然后安装被中止):

这就是我在 silentArgs 中传递这些参数的方式:

silentArgs = "/qn /norestart /l*v `"$($env:TEMP)$($packageName).$($env:chocolateyPackageVersion).MsiInstall.log`" /CUSTOMPARAM1:'dummydata' /CUSTOMPARAM2:'dummydata'"

我尝试了不同的语法(我没有使用 :,而是使用了 =,但结果仍然相同)。然后我尝试了 choco install <pckgName> --install-arguments="CUSTOMPARAM1=""dummy.data""",但使用这种方法确实安装了软件包,但没有将参数传递给 MSI 安装程序。我搜索了与 --install-arguments 相关的某种文档,例如它期望的格式(例如引号、=: 等),但没有找到任何内容。

TLDR;我想通过 choco 将自定义 parameters/arguments 传递给我的 MSI 安装程序。

在我看来,您将同一个参数传递了两次,一次是在您的包的静默参数中,另一次是在调用 choco install 时。我认为这就是问题所在,因为我相信 msiexec 将使用它为给定参数找到的 first 值。如果要覆盖静默参数,则需要将 --override-arguments 参数添加到 choco install。这种方法的缺点是这将覆盖 all 烘焙到包中的静默参数,因此您还需要提供安装包所需的所有静默参数。

如果这是您开发的包(看起来可能是),我建议改用 package parameters。通过这种方式,您可以保留默认的静默安装参数,并且在您的 ChocolateyInstall.ps1 中,您可以将每个 CUSTOMPARAM 添加到 -SilentArgs 通过包参数传入或可选地设置默认值(或省略额外参数) 对于未传入的参数。如果未提供 require 包参数,您也可以抛出错误。

对于管理 MSI 的安装程序包,您必须将参数传递给底层安装程序,因为安装程序希望看到它们,对于 MSI,即 UPPERCASEPROPERTY="Value" NEXTPROPERTY="Another value"。否则 MSI exec 会像你看到的那样弹出,告诉你你传递给它的东西不正确。

如果您要创建包装,可以使用三种方法:

  1. 包装中
  2. Install-Arguments(如果您使用的是无法更改的包,则唯一的选择)
  3. 包参数(推荐)

我将更详细地介绍每一个。

包装中 - chocolateyInstall。ps1

您实际上在这方面非常接近。您需要做的就是更改:

/CUSTOMPARAM1:'dummydata'

silentArgs = "/qn /norestart /l*v `"$($env:TEMP)$($packageName).$($env:chocolateyPackageVersion).MsiInstall.log`" /CUSTOMPARAM1:'dummydata' /CUSTOMPARAM2:'dummydata'"

至:

CUSTOMPARAM1=`"dummydata`",例如下面的(我在下面将 CUSTOMPARAM1 重命名为 MSIPROPERTY 以表示这些必须已经作为您可以设置的属性存在于 MSI 安装程序中):

silentArgs = "/qn /norestart /l*v `"$($env:TEMP)$($packageName).$($env:chocolateyPackageVersion).MsiInstall.log`" MSIPROPERTY=`"dummydata`" EXISTINGMSIPROPERTY2=`"dummydata`""

运行时安装参数 - choco install

您还可以在运行时将额外的参数直接传递给安装程序。

choco install <pkgName> --install-arguments="'CUSTOMPARAM1=""dummy.data""'"(注意:引用位特定于 shell 你是 运行,cmd.exe 期望这些方式并且 powershell.exe 需要它们有点不同。)。 https://docs.chocolatey.org/en-us/choco/commands/#how-to-pass-options-switches(请参阅参数中的传递引号)另请注意,这是不同的,因为它使用引号书尾撇号,正如 Chocolatey 文档所描述的那样 ("'values'")。

此外,如果您想覆盖已经通过 silentArgs 传递的安装参数,而不是仅仅附加到它的末尾,您需要使用一个额外的开关 --override-arguments。来自 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.

包参数

这是将包参数放在 ChocolateyInstall 中的组合。ps1 然后决定如何将它们传递给 silentArgs。

根据文档,您需要为每个参数指定默认选项,然后您将寻求正确转换。

基于 https://docs.chocolatey.org/en-us/guides/create/parse-packageparameters-argument,您可以在脚本中设置如下内容:

$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 

您可能希望将这些参数添加到您的 nuspec 文件的描述中。 https://docs.chocolatey.org/en-us/guides/create/parse-packageparameters-argument#step-2-add-package-parameters-to-the-description

中概述了一种特定格式

然后你可以像这样调用 Choco 安装:

choco install <pkgName> --package-parameters="'/SOMEPROPERTY=dummy.data'"

包参数的好处:

  • 语法更容易通过 - 不需要奇怪的引用问题。
  • 您可以设置合理的默认值。
  • 您可以验证通过 属性 传入的内容。
  • 您可以随意命名并将它们转换为安装程序参数。
  • 您可以在验证值时提供比 MSI exec 弹出窗口或无用的错误代码更好的解释。
  • 如果有您需要的必需参数,您可以使包失败。
  • 您也可以将包参数用于其他用途 - https://docs.chocolatey.org/en-us/guides/create/parse-packageparameters-argument#example