2010-09-08 2 views
3

Я не помню, чтобы в PowerShell было предложено несколько вариантов, но я видел несколько примеров хостов, реализующих этот интерфейс. К сожалению, это единственные ссылки, которые я видел в интерфейсе. Я никогда не видел «вот как проверить, правильно ли вы его реализуете».Какие командлеты используют интерфейс IHostUISupportsMultipleChoiceSelection для запроса выбора?

ответ

4

Пожалуйста, обращайте внимание на мой первый ответ ; это не ответ, как я вижу сейчас. И спасибо за действительно интересный вопрос.

Я до сих пор не знаю командлетов, которые используют этот интерфейс. Но мы можем использовать его сами по сценариям. Давайте изменим упомянутый 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 также поддерживает это, но, возможно, пользовательский интерфейс может быть чем-то лучше в графическом интерфейсе.

+0

Жаль, что я не мог дать вам больше одного взлёта. Это именно то, что я искал. Я очень ценю дополнительное внимание, которое вы дали. –

2

Например: команда 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

+0

Хорошее сообщение в блоге. Жаль, что эта функция не отображается через Read-Host. –

+0

Метод в интерфейсе, о котором я прошу, возвращает коллекцию вариантов. Этот пример выглядит как стандартная подсказка «выберите один из списка». –

+0

Интерфейс IHostUISupportsMultipleChoiceSelection от вопроса имеет единственный метод 'PromptForChoice', который показан в моем примере. См. Также: http://msdn.microsoft.com/en-us/library/system.management.automation.host.ihostuisupportsmultiplechoiceselection_members –