【问题标题】:How to pass installation arguments directly to an MSI installer (like -ArgumentLIist in PowerShell) using Chocolatey?如何使用 Chocolatey 将安装参数直接传递给 MSI 安装程序(如 PowerShell 中的 -ArgumentLIist)?
【发布时间】:2021-08-02 12:37:35
【问题描述】:

我想将自定义参数直接传递给 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 将自定义参数/参数传递给我的 MSI 安装程序。

【问题讨论】:

    标签: package windows-installer nuget-package package-managers chocolatey


    【解决方案1】:

    对于管理 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(参见 Pass Quotes in Arguments)另请注意,这是不同的,因为它使用了 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

    【讨论】:

    • 非常感谢您的详细解答。最后,我最终使用了包参数
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回答!最后,我确实最终在我的 -SilentArgs 中使用了自定义参数。我知道我必须从一开始就这样做,但我找不到任何关于自定义参数格式应该是什么样子的文档。如果有人遇到过同样的问题,我在silentArgs 中使用了 PARAM1=value1 PARAM2=value2 等。
    • 是的,“包参数”在你如何称呼它们时有点时髦,但它们工作得很好。我在我自己的几个包中使用它们来确定从哪个端点下载某些安装程序,因为它们在每个数据中心都不同。只是另一个示例用例,显示您也可以在修改 -SilentArgs 之外使用它们。
    猜你喜欢
    • 1970-01-01
    • 2011-04-01
    • 2013-07-23
    • 1970-01-01
    • 2015-07-06
    • 2022-10-13
    • 2020-06-15
    • 1970-01-01
    • 2015-01-09
    相关资源
    最近更新 更多