Передача массива 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:

Я изменил имя функции в соответствии с соглашением об именах глагол-существительное.

Другие вопросы по тегам