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
我正在为我正在做的事情编写一个 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