传递 json 数组以在 powershell 中运行

Pass json array to function in powershell

我有这个简短的脚本,它显示带有行号的 table 并询问用户想要使用哪个 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'

现在我想写一个小函数来显示 table 并从中选择一个项目,以重复用于其他选择。

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' 调用它时,它不显示 table。

为什么它不起作用,我应该修改什么才能使其起作用?

假设第 $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:

我更改了函数名称以符合 verb-noun 命名约定。