2016-09-28 5 views
0

Ich habe eine PowerShell-Funktion, mit der ich interaktive Menüs im laufenden Betrieb erstellen kann. Ich übergebe Werte an einen Array-Namen $ mlist und erzeuge dann das Menü basierend auf dem Inhalt des Arrays. Der Benutzer wählt einfach die Nummer aus, die seiner gewünschten Wahl zugeordnet ist. Der Code funktioniert einwandfrei, wenn das Array 9 Elemente oder weniger enthält. Wenn das Array mehr als 9 Elemente enthält, ist die einzige Auswahl, die ich wählen kann, "1". Wenn Sie eine andere Auswahl treffen, wird das Menü erneut angezeigt. Ich habe es in einer while-Anweisung gekapselt und dies ist die gewünschte Funktion, wenn kein Element ausgewählt ist. Im Grunde ignoriert es einen anderen Eintrag als "1", wenn das Array mehr als 9 Elemente enthält. Hier ist der Code:Benutzerauswahlmenü aus einem PowerShell-Array mit mehr als 9 Elementen

$global:ans = $null 
$global:selection = $null 
While ($ans -lt 1 -or $ans -gt $mlist.count){ 
    $mhead 
    Write-Host # empty line 
    $menu = @{} 
    for ($i=1;$i -le $mlist.count;$i++) { 
     if ($mlist.count -gt 1){ 
      Write-Host -fore Cyan " $i." $($mlist[$i-1]) 
      $menu.Add($i,($mlist[$i-1])) 
     }else{ 
      Write-Host -fore Cyan " $i." $mlist 
      $menu.Add($i,$mlist) 
     } 
    } 
    Write-Host # empty line 
    $global:ans = Read-Host 'Please enter selection' 
} 
$global:selection = $menu.Item([int]$ans) 
+0

Welche Daten wurden in dem Array enthalten, das in die Funktion übergeben wurde? Ich habe versucht mit sowohl dynamischen als auch statischen Arrays von Strings. –

+0

Ok, also update ... mein Array hat 12 Elemente. Ich kann 1, 10, 11 und 12 wählen, aber nicht 2-9. Mein Array wird erstellt, indem vCenter abgefragt und Hosts ausgewählt werden, die bestimmten Kriterien entsprechen. Also mein Array enthält die Hostnamen von 12 ESXi-Hosts. –

Antwort

1

Read-Host liest einen String, und diese Linie:

While ($ans -lt 1 -or $ans -gt $mlist.count){ 

vergleicht sie mit Zahlen. Bei dieser Art von Vergleich wirft PowerShell das Ding rechts auf den Typ des Dinges links. $ans ist "5" und $mlist.count wird "12" und String-Sortierung setzt sie in Reihenfolge "12","5", so löst es $ans -gt $mlist.count und Schleifen wieder.

Fix: es in eine Ganzzahl umwandeln.

$global:ans = Read-Host 'Please enter selection' 
$global:ans = $global:ans -as [int] 

Es ist eine gute Praxis auf der linken festen Dinge zu haben, als Gleichheit Prüfung/größer/kleiner als und Variablen auf der rechten Seite, aus diesem Grund.

Wenn ich auf der ganzen Sache kommentierten, ich könnte es umschreiben als:

$mlist = ('a')#,'b','c','d','e','f','g','h','i','j','k') 

# Force $mlist to always be an array, even if only 1 thing in it, to remove if/then test. 
$mlist = @($mlist) 


$global:selection = $null 

Do 
{ 
    $mhead 
    Write-Host # empty line 

    for ($i=0; $i -lt $mlist.count; $i++) 
    { 
     Write-Host -ForegroundColor Cyan " $($i+1)." $mlist[$i] 
    } 
    Write-Host # empty line 
    $global:ans = (Read-Host 'Please enter selection') -as [int] 

} While ((-not $ans) -or (0 -gt $ans) -or ($mlist.Count -lt $ans)) 

$global:selection = $mlist[$ans - 1] 
$global:selection 

Diese des loswird, wenn/dann, es des $menu Wörterbuch entledigt, wird es loszuwerden $ ans Initialisierung zuerst mit do/while.

+0

Funktioniert perfekt. Ich hatte Probleme, wenn $ mlist nur ein einzelnes Element enthielt, also hilft es auch, dies zu ändern, um dieses Problem zu beheben. Vielen Dank! –

Verwandte Themen