我需要在我的TFS构建管道中执行PowerShell脚本。 PowerShell脚本是通用的,并执行给定的给定AWS Cloud Formation模板。我需要开发人员为模板提供表示模板参数的键/值对列表。由于他们可以使用它来执行任何Cloud Formation模板,因此输入参数会有所不同。
如何创建一个基于键/值的输入参数,我可以将其作为参数传递给另一个接受参数Hashmap的PowerShell对象?
以下伪代码是我试图实现的目标
param(
[Parameter(Mandatory=$true)][string]$environment,
[KeyValuePair[]]$templateParameters
)
New-CFNStack -StackName $stackName -TemplateURL $fullTemplateUrlPath -Parameters @( $templateParameters)
我可以显式创建参数并像这样传递它们:
$bucketNameParameter = new-object Amazon.CloudFormation.Model.Parameter
$bucketNameParameter.ParameterKey = "bucketname"
$bucketNameParameter.ParameterValue = "FooBar"
$isVersionedParameter = new-object Amazon.CloudFormation.Model.Parameter
$isVersionedParameter.ParameterKey = "bucketname"
$isVersionedParameter.ParameterValue = "FooBar"
New-CFNStack -StackName $stackName -TemplateURL $fullTemplateUrlPath -Parameters @( $environmentParameter, @isVersionedParameter )
由于每个模板都有完全不同的参数,我想使这个脚本灵活,以方便重复使用。什么是最接近它的PowerShell方式?
答案 0 :(得分:3)
您可以接受[hashtable]
个实例,并根据其条目创建[Amazon.CloudFormation.Model.Parameter]
个实例:
param(
[Parameter(Mandatory=$true)] [string] $environment,
[hashtable] $templateParameters
)
# Convert the hashtable's entries to an array of
# [Amazon.CloudFormation.Model.Parameter] instances.
$params = $templateParameters.GetEnumerator() | ForEach-Object {
$param = New-Object Amazon.CloudFormation.Model.Parameter
$param.ParameterKey = $_.Key
$param.ParameterValue = $_.Value
$param # output
}
New-CFNStack -StackName $stackName -TemplateURL $fullTemplateUrlPath -Parameters $params
注意使用.GetEnumerator()
,这是枚举哈希表条目并通过管道发送它们所必需的;默认情况下,PowerShell通过管道将哈希表作为整体发送。
使用您的(已修改为唯一的)示例值,您可以调用脚本:
./script.ps1 -environment foo `
-templateParameters @{ bucketName1 = 'FooBar1'; bucketName2 = 'FooBar2' }