传递 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 命名约定。
我有这个简短的脚本,它显示带有行号的 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 命名约定。