Передача массива json для работы в PowerShell
У меня есть этот короткий сценарий, который отображает таблицу с номерами строк и спрашивает пользователя, какую подписку Azure хочет использовать. Работает аккуратно.
$subscriptions = $(& az account list --query '[].{name:name}' --output json) | ConvertFrom-Json
$subscriptions | ForEach-Object {$index=0} {$_; $index++} | Format-Table -Property @{ Label="index";Expression={$index}; Width=5 },Name
$subChoice = Read-Host 'Choose subscription'
Теперь я хочу написать небольшую функцию для отображения таблицы и выбора элемента из нее, чтобы повторно использовать ее для других вариантов.
function GetChoice {
param (
[Parameter(Mandatory = $true)][psobject] $list,
[Parameter(Mandatory = $true)][string] $prompt
)
$list | ForEach-Object {$index=0} {$_; $index++} | Format-Table -Property @{ Label="index";Expression={$index}; Width=5 },Name
$choice = Read-Host $prompt
}
Когда я звоню с $subChoice = GetChoice $subscriptions 'Choose subscription'
он не отображает таблицу.
Почему это не работает и что мне нужно изменить, чтобы это заработало?
1 ответ
Предположим результат строки $subscriptions = $(& az account list --query '[].{name:name}' --output json) | ConvertFrom-Json
выглядит примерно так:
$subscriptions = [PsCustomObject] @{ 'Name' = 'Subscription one' },
[PsCustomObject] @{ 'Name' = 'Subscription two' },
[PsCustomObject] @{ 'Name' = 'Subscription three' }
Тогда измените свой GetChoice
функция в:
function Get-Choice {
param (
[Parameter(Mandatory = $true, Position = 0)][psobject[]] $list,
[Parameter(Mandatory = $true, Position = 1)][string] $prompt
)
$index = 0
$msg = $list | ForEach-Object { [PsCustomObject] @{'Index' = $index++; 'Name' = $_.Name }} | Format-Table -AutoSize | Out-String
Write-Host $msg
Read-Host $prompt
}
и назовите это так
$choice = Get-Choice $subscriptions 'Choose subscription'
# show whatever the user typed in
$choice
Результат:
Index Name ----- ---- 0 Subscription one 1 Subscription two 2 Subscription three Choose subscription:
Я изменил имя функции в соответствии с соглашением об именах глагол-существительное.