1

我有一个 powershell 脚本,它将我的变量传递给我的 helm upgrade 命令

param
(   
    [Parameter(Mandatory = $false)]
    $HELM_SET
)
    helm upgrade --install myrelease -n dev my_service.tgz $HELM_SET 

我的 HELM_SET 变量包含:
--set config.vali=x --set config.spring=v1

但是 helm 升级后说: Error: unknown flag: --set config.vali helm.go:88: [debug] unknown flag: --set config.vali

如果我在其中添加“--set” helm upgrade --install myrelease -n dev my_service.tgz --set $HELM_SET 并且我的 HELM_SET var 现在包含: config.vali=x --set config.spring=v1

升级后我收到我的 config:vali var 是x --set config.spring=v1

有人可以解释我做错了什么吗?

4

1 回答 1

1

如果您$HELM_SET作为编码多个参数的单个字符串传递,则不能将其按原样传递给 command

相反,您需要将此字符串解析为单个参数的数组。

最简单的情况下,使用运算-split的一元形式,它通过空格将字符串拆分为标记数组:

helm upgrade --install myrelease -n dev my_service.tgz (-split $HELM_SET)

但是,如果您的参数包含带引号的字符串(例如--set config.spring="v 1"),则需要做更多的工作,因为带引号的字符串必须被识别,以免通过嵌入的空格将它们分成多个标记:

# Note: Use of Invoke-Expression is safe here, but should generally be avoided.
$passThruArgs = (Invoke-Expression ('Write-Output -- ' + $HELM_SET -replace '\$', "`0")) -replace "`0", '$$'

helm upgrade --install myrelease -n dev my_service.tgz $passThruArgs

有关此技术的说明,请参阅此答案


如果您控制脚本的调用,则可以使用更简单的解决方案

正如Santiago Squarzon指出的那样,您可以使用ValueFromRemainingArguments参数声明的属性来收集所有参数(未绑定到其他参数):

param
(   
    [Parameter(ValueFromRemainingArguments)]
    $__passThruArgs # Choose an exotic name that won't be used in the actual arguments
)

helm upgrade --install myrelease -n dev my_service.tgz $__passThruArgs

与其将传递参数作为单个字符串传递,不如将它们作为单独的参数传递:

./yourScript.ps1 --set config.vali=x --set config.spring=v1
于 2021-11-25T00:09:09.403 回答