使用函数的返回值作为另一个函数调用的参数[重复]

Posted

技术标签:

【中文标题】使用函数的返回值作为另一个函数调用的参数[重复]【英文标题】:Using a return value of a function as parameter for another function call [duplicate] 【发布时间】:2022-01-13 15:31:45 【问题描述】:

我正在尝试将机密从一个 Azure Key Vault 复制到另一个。

所以我写了 2 个 Powershell 函数 -

一个用于阅读秘密的:

function GetSecretValue

    param(
        [String] $KeyvaultName,
        [String] $SecretName
    )

    Write-Host "Retrieving secret $SecretName from $KeyvaultName... " -NoNewline
    if ((Get-Command Get-AzKeyVaultSecret).ParameterSets.Parameters.Name -contains "AsPlainText")
    
        # Newer Get-AzKeyVaultSecret version requires -AsPlainText parameter 
        $SecretValue = Get-AzKeyVaultSecret -VaultName $KeyvaultName -Name $SecretName -AsPlainText
    
    else
    
        $SecretValue = (Get-AzKeyVaultSecret -VaultName $KeyvaultName -Name $SecretName).SecretValueText
    
    Write-Host "ok"
    return $SecretValue

还有一个用于创建秘密的:

function SetSecretValue

    param(
        [String] $KeyvaultName,
        [String] $SecretName,
        [String] $SecretValue
    )

    Write-Host "Creating secret $SecretName in $KeyvaultName... " -NoNewline
    $SecureStr = ConvertTo-SecureString -String $SecretValue -AsPlainText -Force
    Set-AzKeyVaultSecret -VaultName $keyvaultName -Name $secretName -SecretValue $SecureStr
    Write-Host "ok"

它们似乎工作正常,但是当我(Powershell 新手)尝试将它们结合起来时 -

SetSecretValue($DestKv, 'ClientId', GetSecretValue($SrcKv, 'ClientId'))
SetSecretValue($DestKv, 'ClientSecret', GetSecretValue($SrcKv, 'ClientSecret'))

然后我得到语法错误:

+ SetSecretValue($DestKv, 'ClientId', GetSecretValue($Src ...
+                                    ~
Missing closing ')' in expression.

【问题讨论】:

在 PowerShell 中,参数列表周围不需要括号,并且单独的参数参数不应使用逗号分隔:SetSecretValue $DestKv 'ClientId' -SecretValue (GetSecretValue $srcKv 'ClientId')。您可能还想重命名函数以遵循 PowerShell 的 Verb-Noun 语法(例如 Set-SecretValueGet-SecretValue 简而言之:必须调用 PowerShell 函数、cmdlet、脚本和外部程序-foo('arg1', 'arg2')。如果您使用, 分隔参数,您将构造一个命令将其视为单个参数数组。为防止意外使用方法语法,请使用Set-StrictMode -Version 2 或更高版本,但请注意其其他影响。请参阅this answer 了解更多信息。 【参考方案1】:

问题在于您将参数传递给函数的方式,您使用的是 Python 之类的 ? 语法,但是在 PowerShell 中:

所有 cmdlet 参数都是命名参数或位置参数。命名参数要求您在调用 cmdlet 时键入参数名称和参数。位置参数只要求您按相对顺序键入参数。然后系统将第一个未命名参数映射到第一个位置参数。系统将第二个未命名参数映射到第二个未命名参数,依此类推。默认情况下,所有 cmdlet 参数都是命名参数。

请参阅Types of Cmdlet Parameters 了解更多信息。


一个例子,使用这两个简单的函数:

function GetSecretValue

    param(
        [String] $KeyvaultName,
        [String] $SecretName
    )
    [System.BitConverter]::ToString(
        [System.Security.Cryptography.HashAlgorithm]::Create('sha256').ComputeHash(
            [System.Text.Encoding]::UTF8.GetBytes(($KeyvaultName, $secretName))
        )
    )


function SetSecretValue

    param(
        [String] $KeyvaultName,
        [String] $SecretName,
        [String] $SecretValue
    )

    [PSCustomObject]@
        Vault = $KeyvaultName
        SecretName = $SecretName
        SecretValue = $SecretValue
    

你可以这样做,使用命名参数

SetSecretValue -KeyvaultName VaultExample -SecretName Secret -SecretValue (GetSecretValue -KeyvaultName VaultExample -SecretName Secret)

Vault        SecretName SecretValue
-----        ---------- -----------
VaultExample Secret     D9-8F-82-B8-D3-97-E8-BB-D0-C7-14-1A-53-56-64-D6-13-AD-8B-DC-3F-22-2F-2E-F2-0D-19-18-B5-C1-77-F6

这看起来很糟糕,幸运的是,splatting 存在:

$params = @
    KeyvaultName = 'VaultExample'
    SecretName   = 'Secret'
    SecretValue  = GetSecretValue -KeyvaultName VaultExample -SecretName Secret


SetSecretValue @params

【讨论】:

以上是关于使用函数的返回值作为另一个函数调用的参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python传入函数作为参数,打印函数名和结果[重复]

JavaScript夯实基础系列:闭包

JavaScript中的Function类型总结

c语言中数组名作为函数参数

每天学一点Scala之 匿名函数

c语言函数调用例子