我正在为正在处理的事情编写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,它似乎根本没有任何作用。
有人可以指出我对此有何疑问吗?
答案 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