如何使用 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 会像你看到的那样弹出,告诉你你传递给它的东西不正确。
如果您要创建包装,可以使用三种方法:
- 包装中
- Install-Arguments(如果您使用的是无法更改的包,则唯一的选择)
- 包参数(推荐)
我将更详细地介绍每一个。
包装中 - 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
我想将自定义参数直接传递给 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 会像你看到的那样弹出,告诉你你传递给它的东西不正确。
如果您要创建包装,可以使用三种方法:
- 包装中
- Install-Arguments(如果您使用的是无法更改的包,则唯一的选择)
- 包参数(推荐)
我将更详细地介绍每一个。
包装中 - 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