Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a Module or Something Similar for Interactive Prompts in PowerShell?

Is there something we can use in PowerShell to ask users to select one item from an array of items? For example, I like how Inquirer.js can do it.

enter image description here

I have also seen PoshGui, but it seems too much work to create just a simple prompt.

The reason we want something similar is that we need to provide deployment scripts for our clients and make deployment guides as easy as possible. Asking users to select one item on a screen is much better than asking them to insert some guid to a config file.

Do you have any suggestions for user prompts for arrays?

like image 408
Denis Molodtsov Avatar asked Oct 18 '25 15:10

Denis Molodtsov


2 Answers

You can also try ps-menu module: https://www.powershellgallery.com/packages/ps-menu

Sample:

enter image description here

like image 198
frizik Avatar answered Oct 21 '25 05:10

frizik


Unfortunately, there's little that is built in, and that little is hard to discover - see below.

Potentially providing a dedicated Read-Choice cmdlet or enhancing Read-Host is being discussed in GitHub issue #6571.

The $host.ui.PromptForChoice() method supports presenting a menu of choices, but it has limitations:

  • The choices are presented on a single line (which may wrap).

  • Only single-character selectors are supported.

  • The selector character must be a part of the menu-item text.

  • Submitting a selection always requires pressing Enter

  • A ? option is invariably offered, even if you don't want to / need to provide explanatory text for each menu item.

Here's an example:

# The list of choices to present.
# Specfiying a selector char. explicitly is mandatory; preceded it by '&'.
# Automating that process while avoiding duplicates requires significantly
# more effort.
# If you wanted to include an explanation for each item, selectable with "?",
# you'd have to create each choice with something like:
#   [System.Management.Automation.Host.ChoiceDescription]::new("&Jumbo", "16`" pie")
$choices = '&Jumbo', '&Large', '&Standard', '&Medium', 'Sma&ll', 'M&icro'

# Prompt the user, who must type a selector character and press ENTER.
# * Each choice label is preceded by its selector enclosed in [...]; e.g.,
#   '&Jumbo' -> '[J] Jumbo'
# * The last argument - 0 here - specifies the default index.
#   * The default choice selector is printed in *yellow*.
#   * Use -1 to indicate that no default should be provided
#     (preventing empty/blank input).
# * An invalid choice typed by the user causes the prompt to be 
#   redisplayed (without a warning or error message).
$index = $host.ui.PromptForChoice("Choose a Size", "Type an index and press ENTER:", $choices, 0)

"You chose: $($choices[$index] -replace '&')"

This yields something like:

enter image description here

like image 42
mklement0 Avatar answered Oct 21 '25 07:10

mklement0