从CLI

时间:2018-06-07 23:23:54

标签: powershell

我需要在我的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方式?

1 个答案:

答案 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' }