Я не помню, чтобы в PowerShell было предложено несколько вариантов, но я видел несколько примеров хостов, реализующих этот интерфейс. К сожалению, это единственные ссылки, которые я видел в интерфейсе. Я никогда не видел «вот как проверить, правильно ли вы его реализуете».Какие командлеты используют интерфейс IHostUISupportsMultipleChoiceSelection для запроса выбора?
ответ
Пожалуйста, обращайте внимание на мой первый ответ ; это не ответ, как я вижу сейчас. И спасибо за действительно интересный вопрос.
Я до сих пор не знаю командлетов, которые используют этот интерфейс. Но мы можем использовать его сами по сценариям. Давайте изменим упомянутый Get-Choice.ps1 и вызвать новый Get-Choice2.ps1:
<#
.SYNOPSIS
Displays PowerShell style menu and gets user choices
.DESCRIPTION
*) Returns choice indexes.
*) Choice keys are indicated by '&' in menu items.
*) Help strings can be empty or nulls (items are used themselves).
#>
param
(
# Menu caption
[string]$Caption = 'Confirm',
# Menu message
[string]$Message = 'Are you sure you want to continue?',
# Choice info pairs: item1, help1, item2, help2, ...
[string[]]$Choices = ('&Yes', 'Continue', '&No', 'Stop'),
# Default choice indexes (i.e. selected on [Enter])
[int[]]$DefaultChoice = @(0)
)
if ($args) { throw "Unknown parameters: $args" }
if ($Choices.Count % 2) { throw "Choice count must be even." }
$descriptions = @()
for($i = 0; $i -lt $Choices.Count; $i += 2) {
$c = [System.Management.Automation.Host.ChoiceDescription]$Choices[$i]
$c.HelpMessage = $Choices[$i + 1]
if (!$c.HelpMessage) {
$c.HelpMessage = $Choices[$i].Replace('&', '')
}
$descriptions += $c
}
$Host.UI.PromptForChoice($Caption, $Message, [System.Management.Automation.Host.ChoiceDescription[]]$descriptions, $DefaultChoice)
Теперь мы протестируем его
Get-Choice2 'Title' 'Message' -DefaultChoice 0, 1, 2 -Choices @(
'Choice &1', 'This is choice 1'
'Choice &2', ''
'Choice &3', ''
'Choice &4', ''
'Choice &5', ''
'Choice &6', ''
'Choice &7', ''
'Choice &8', ''
'Choice &9', ''
'Choice &0', ''
)
Он печатает 10 вариантов, первый 3 выделены (в консоли хоста), и предлагает:
0> Test-Get-Choice2.ps1
Title
Message
[1] Choice 1
[2] Choice 2
[3] Choice 3
[4] Choice 4
[5] Choice 5
[6] Choice 6
[7] Choice 7
[8] Choice 8
[9] Choice 9
[0] Choice 0
[?] Help
(default choices are 1,2,3)
Choice[0]:
Если нажать Enter
сразу выход по умолчанию 3 индексирует: 0, 1, 2. Если мы вводим, например: 5 + Enter + 3 + Enter + 1 + Enter + Enter
, то выход составляет 4 , 2, 0.
Это работает. PowerShell ISE также поддерживает это, но, возможно, пользовательский интерфейс может быть чем-то лучше в графическом интерфейсе.
Например: команда Remove-Item C:\TEMP\Test
предложит вам выбрать:
Confirm
The item at C:\TEMP\Test has children and the Recurse parameter was not specified. If you continue, all children will be removed with the item. Are you sure you want to continue?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):
Или вы можете создать свой собственный вызов, используя этот скрипт (или его идею): Get-Choice.ps1 - Displays PowerShell style menu and gets a user choice
Хорошее сообщение в блоге. Жаль, что эта функция не отображается через Read-Host. –
Метод в интерфейсе, о котором я прошу, возвращает коллекцию вариантов. Этот пример выглядит как стандартная подсказка «выберите один из списка». –
Интерфейс IHostUISupportsMultipleChoiceSelection от вопроса имеет единственный метод 'PromptForChoice', который показан в моем примере. См. Также: http://msdn.microsoft.com/en-us/library/system.management.automation.host.ihostuisupportsmultiplechoiceselection_members –
Жаль, что я не мог дать вам больше одного взлёта. Это именно то, что я искал. Я очень ценю дополнительное внимание, которое вы дали. –