PowerShell - передача хеш-таблиц в функцию - PullRequest
0 голосов
/ 08 июня 2019

Я нахожусь в процессе написания 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
    }
}

Если я просто получаю доступ к $option непосредственно в foreach, он выводит таблицу, например:

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

Если я попытаюсь получить доступ к $option.Name или .Value, то это, похоже, ничего не делает.

Может кто-нибудь указать, где я не так с этим, пожалуйста?

Ответы [ 2 ]

2 голосов
/ 08 июня 2019

Я думаю, вы можете использовать метод GetNumerator() для итерации записей хеш-таблицы.Затем создайте пользовательское сообщение, используя оператор формата -f.$i здесь есть что-то, чтобы отследить число для каждой строки в выводе.Это должно быть довольно динамично, если ваши значения / описания постоянно сформулированы, чтобы не было проблем с грамматикой / пониманием.

$i = 1
foreach ($option in $options.GetEnumerator()) {
    "{2}. Enter {0} for {1}" -f $option.key,$option.value,$i++
}
1 голос
/ 08 июня 2019

Для всех, кто интересуется, это выглядит так:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...