Was Cmdlets die IHostUISupportsMultipleChoiceSelection Schnittstelle zur Eingabeaufforderung für Entscheidungen?

StackOverflow https://stackoverflow.com/questions/3664061

  •  01-10-2019
  •  | 
  •  

Frage

Ich erinnere mich nicht immer für eine Mehrfachauswahl wird aufgefordert, bevor sie in Powershell, aber ich habe einige Beispiele für Hosts Umsetzung dieser Schnittstelle gesehen. Leider sind dies die einzigen Referenzen, die ich an die Schnittstelle gesehen habe. Ich habe noch nie „ist hier, wie zu testen, dass Sie es richtig sind Umsetzung“ zu sehen.

War es hilfreich?

Lösung

Bitte, ignorieren meine erste Antwort; es ist keine Antwort auf alle, wie ich jetzt sehen kann. Und vielen Dank für eine wirklich interessante Frage.

Ich weiß immer noch nicht Cmdlets, die diese Schnittstelle verwenden. Aber wir können es selbst von Skripten. Lassen Sie uns die genannten Get-Choice.ps1 ändern und rufen Sie die neue 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)

wir es jetzt testen:

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', ''
)

Er druckt 10 Entscheidungen, die ersten 3 (in der Konsole Host) markiert sind, und Eingabeaufforderungen:

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]:

Wenn wir Enter drücken sofort die Ausgabe ist der Standard-3-Indizes: 0, 1, 2. Wenn wir geben, zum Beispiel:. 5 + Enter + 3 + Enter + 1 + Enter + Enter dann ist der Ausgang 4, 2, 0

Es funktioniert. Powershell ISE unterstützt auch das, aber die UI könnte etwas besser in GUI-Version, vielleicht.

Andere Tipps

Zum Beispiel: Mit dem Befehl Remove-Item C:\TEMP\Test Aufforderungen Sie wählen:

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"):

Oder Sie können Ihren eigenen Ruf mit diesem Skript (oder seine Idee) bauen: Get-Choice.ps1 - Zeigt Powershell-Stil-Menü und erhält eine Benutzerauswahl

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top