使用函数的 return 值作为另一个函数调用的参数
Using a return value of a function as parameter for another function call
我正在尝试将机密从一个 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.
问题是您将参数传递给函数的方式,您使用的是 Python 之类的 ? 语法,但是在 PowerShell 中:
All cmdlet parameters are either named or positional parameters. A named parameter requires that you type the parameter name and argument when calling the cmdlet. A positional parameter requires only that you type the arguments in relative order. The system then maps the first unnamed argument to the first positional parameter. The system maps the second unnamed argument to the second unnamed parameter, and so on. By default, all cmdlet parameters are named parameters.
有关详细信息,请参阅 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
我正在尝试将机密从一个 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.
问题是您将参数传递给函数的方式,您使用的是 Python 之类的 ? 语法,但是在 PowerShell 中:
All cmdlet parameters are either named or positional parameters. A named parameter requires that you type the parameter name and argument when calling the cmdlet. A positional parameter requires only that you type the arguments in relative order. The system then maps the first unnamed argument to the first positional parameter. The system maps the second unnamed argument to the second unnamed parameter, and so on. By default, all cmdlet parameters are named parameters.
有关详细信息,请参阅 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