PowerShell - 将哈希表传递给函数

PowerShell - Passing hashtables to a function

我正在为我正在做的事情编写一个 CLI,在这个过程的不同阶段我想询问用户输入。每次我要求用户输入时,questions/answers 可能会有所不同,所以我开始使用类似的东西:

$choices = [Management.Automation.Host.ChoiceDescription[]] @(
    New-Object Management.Automation.Host.ChoiceDescription("&Yes","Option Description for Yes")
    New-Object Management.Automation.Host.ChoiceDescription("&No","Option Description for No.")
)
$choice = $Host.UI.PromptForChoice("Question Title","Question Text",$choices,1)

这很好用,但在重复使用时有点笨拙,尤其是在选择数量增加的情况下。

我想将它包装在一个我可以更轻松调用的函数中 - 例如:

$options = @{
            Yes = "Option Description for Yes" 
            No = "Option Description for No"
        }
askQuestion -title "Question Title" -question "Question Text" -options $options

到目前为止一切顺利。我正在努力的一点是访问 $options:

的属性
function askQuestion {
    param (
        [hashtable]$options,
        [string]$title,
        [string]$question
    )
    Write-Host $title -ForegroundColor Cyan
    Write-Host $question -ForegroundColor Cyan

    foreach($option in $options)
    {
        # Do stuff HERE
    }
}

如果我直接在 foreach 中访问 $option,它会打印出一个 table,例如:

Name                           Value
----                           -----
No                             Option Description for No
Yes                            Option Description for Yes

如果我尝试访问 $option.Name 或 .Value,它似乎什么也没做。

有人可以指出我哪里出错了吗?

我认为您可以使用 GetNumerator() 方法遍历散列 table 条目。然后使用格式运算符 -f 创建自定义消息。 $i 这里只是跟踪输出中每一行的数字。这应该是相当动态的,前提是您的 values/descriptions 措辞一致,因此没有 grammatical/comprehension 问题。

$i = 1
foreach ($option in $options.GetEnumerator()) {
    "{2}. Enter {0} for {1}" -f $option.key,$option.value,$i++
}

对于任何感兴趣的人,这是完成后的样子:

function askQuestion {
    param (
        [hashtable]$options,
        [string]$title,
        [string]$question
    )

    $choices = [Management.Automation.Host.ChoiceDescription[]] @(
        foreach ($option in $options.GetEnumerator()) {
            $selection = $option.key
            $description = $option.value
            New-Object Management.Automation.Host.ChoiceDescription("&$selection",$description)
         }
    )
    $choice = $Host.UI.PromptForChoice($title,$question,$choices,1)
    return
}

而且可以这样调用,$options 非常灵活。

$options = @{
    Yes = "Yes Description" 
    No = "No Description"
    Maybe = "Maybe Description"
}

askQuestion -title "Question Title" -question "Question Text" -options $options