PowerShell-将哈希表传递给函数

时间:2019-06-08 13:29:55

标签: powershell hashtable

我正在为正在处理的事情编写CLI,并且在此过程中的各个阶段我都想请用户输入。每次我要求用户输入内容时,问题/答案可能会有所不同,因此我开始使用以下内容:

$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,它会打印出如下表:

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

如果我尝试访问$option.Name或.Value,它似乎根本没有任何作用。

有人可以指出我对此有何疑问吗?

2 个答案:

答案 0 :(得分:2)

我认为您可以使用GetNumerator()方法遍历哈希表条目。然后使用格式运算符-f创建自定义消息。 $i只是用来跟踪输出中每行数字的东西。只要您的价值观/描述始终保持措辞一致,那么这应该是相当动态的,这样就不会有语法/理解上的问题。

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

答案 1 :(得分:1)

对于任何感兴趣的人,这就是最终的样子:

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