Отправить переменное количество пар ключ-значение из CLI - PullRequest
0 голосов
/ 08 июня 2018

Мне нужно выполнить скрипт PowerShell как часть моего конвейера сборки TFS.Сценарий PowerShell является универсальным и выполняет заданный ему шаблон AWS Cloud Formation.Мне нужно, чтобы разработчик предоставил шаблону список пар ключ / значение, которые представляют параметры шаблона.Поскольку они могут использовать это для выполнения любого шаблона Cloud Formation, входные параметры будут различаться.

Как создать входной параметр на основе ключ / значение, который я могу передать в качестве параметра другому объекту 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 голосов
/ 08 июня 2018

Вы можете принять экземпляр [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' }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...