2016-11-16 4 views
1
lassen

Ich bin kein großer Scripter, und ich bin in der Übersetzung verloren ... vielleicht ist dies völlig falsch ... ich tuePowershell - Benutzerwahl aus der Liste der von Januar bis Dezember

Ich bin Erstellen eines Skripts und ich möchte, dass der Benutzer aus einer Liste von Auswahlmöglichkeiten auswählt, insbesondere den Monat des Jahres. Dieses Ergebnis wird später im Skript verwendet.

Hier ist der Code-Schnipsel:

$optionQuit = New-Object System.Management.Automation.Host.ChoiceDescription "Quit", "Quit" 
$option1 = New-Object System.Management.Automation.Host.ChoiceDescription "01-January", "01-January OU" 
$option2 = New-Object System.Management.Automation.Host.ChoiceDescription "02-February", "02-February OU" 
$option3 = New-Object System.Management.Automation.Host.ChoiceDescription "03-March", "03-March OU" 
$option4 = New-Object System.Management.Automation.Host.ChoiceDescription "04-April", "04-April OU" 
$option5 = New-Object System.Management.Automation.Host.ChoiceDescription "05-May", "05-May OU" 
$option6 = New-Object System.Management.Automation.Host.ChoiceDescription "06-June", "06-June OU" 
$option7 = New-Object System.Management.Automation.Host.ChoiceDescription "07-July", "07-July OU" 
$option8 = New-Object System.Management.Automation.Host.ChoiceDescription "08-August", "08-August OU" 
$option9 = New-Object System.Management.Automation.Host.ChoiceDescription "09-September", "09-September OU" 
$option10 = New-Object System.Management.Automation.Host.ChoiceDescription "10-October", "10-October OU" 
$option11 = New-Object System.Management.Automation.Host.ChoiceDescription "11-November", "11-November OU" 
$option12 = New-Object System.Management.Automation.Host.ChoiceDescription "12-December", "12-December OU" 
$options = [System.Management.Automation.Host.ChoiceDescription[]]($optionQuit, $option1, $option2, $option3, $option4. $option5, $option6, $option7, $option8, $option9, $option10, $option11, $option12) 
$result = $host.ui.PromptForChoice($title, $message, $options, [int[]](0)) 

Allerdings halte ich erhalte eine Fehlermeldung:

ERROR: Exception calling "PromptForChoice" with "4" argument(s): "Object reference not set to an instance of an object." TestingMenu.ps1 (31, 1): ERROR: At Line: 31 char: 1 ERROR: + $result = $host.ui.PromptForChoice($title, $message, $options, [int[] ... ERROR: + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ERROR: + CategoryInfo : NotSpecified: (:) [], MethodInvocationException ERROR: + FullyQualifiedErrorId : NullReferenceException ERROR:

Ich bin mir nicht sicher, was ich vermisse ... und ich dies wahrscheinlich machen komplizierter als nötig sein ... aber die Endvariable $ result sollte etwa so aussehen wie "04-April".

Irgendeine Idee, was ich hier vermisse?

+0

Hat Sie sollten eine 'Collection', kein Array senden. Ihre 'ChoiceDescription []' ist ein Array. Werfen Sie einen Blick auf das Beispiel auf MSDN [hier] (https://msdn.microsoft.com/en-us/library/system.management.automation.host.pshostuserinterface.promptforchoice (v = vs.85) .aspx) – gravity

+1

Bei so vielen Auswahlen könnten Sie Ihren Code so umgestalten, dass etwas wie folgt aussieht: $ result = $ options | Out-GridView -Title "Wählen Sie ein Element" -OutputMode Single gibt Ihnen das gewünschte Verhalten. –

+1

@gravity Array kann implizit in 'Collection' konvertiert werden, weil' Collection' [dieses Konstruktor] (https://msdn.microsoft.com/en-us/library/ms132401.aspx) und ein Zero-basiertes Array mit einer Dimension enthält Implementieren der generischen Version von 'IList'. – PetSerAl

Antwort

2

Betrachten Sie Ihre Optionen Variable, Sie haben einen Punkt statt ein Komma nach $ Option4.

Fix das und es sollte funktionieren.

$options = [System.Management.Automation.Host.ChoiceDescription[]]($optionQuit, $option1, $option2, $option3, $option4, $option5, $option6, $option7, $option8, $option9, $option10, $option11, $option12) 
+0

grrr ... Ich kann nicht glauben, dass ich das verpasst habe ... danke. – TheCleaner

1

Diese Variante funktioniert und ist nicht so redundant. Ohne Kennzeichnung der Brief mit einem & Ampersand Wahl zu wählen, macht keinen Sinn

# C:\Test\Choose-CUI.ps1 
[email protected](
    ("&Quit","Quit"), 
    ("0&1-January","01-January OU"), 
    ("0&2-February","02-February OU"), 
    ("0&3-March","03-March OU"), 
    ("0&4-April","04-April OU"), 
    ("0&5-May","05-May OU"), 
    ("0&6-June","06-June OU"), 
    ("0&7-July","07-July OU"), 
    ("0&8-August","08-August OU"), 
    ("0&9-September","09-September OU"), 
    ("1&0-October","10-October OU"), 
    ("11-&November","11-November OU"), 
    ("12-&December","12-December OU") 
) 
$choicedesc = New-Object System.Collections.ObjectModel.Collection[System.Management.Automation.Host.ChoiceDescription] 
for($i=0; $i -lt $choices.length; $i++){ 
    $choicedesc.Add((New-Object System.Management.Automation.Host.ChoiceDescription $choices[$i])) } 
$Host.ui.PromptForChoice($caption, $message, $choicedesc, $default) 

dieser Ausgang

PS C:\Test> .\Choose-CUI.ps1 
[Q] Quit 
[1] 01-January 
[2] 02-February 
[3] 03-March 
[4] 04-April 
[5] 05-May 
[6] 06-June 
[7] 07-July 

[8] 08-August 
[9] 09-September 
[0] 10-October 
[N] 11-November 
[D] 12-December 
[?] Help 
Choice[0]: 
+0

BTW, Sie können '$ Auswahlen [$ i] [0], $ Auswahlen [$ i] [1]' mit nur '$ Wahlen [$ i]' ersetzen. – PetSerAl

+0

@PetSerAl Sorry, aber nein, es werden dann sowohl [0] als auch [1] ausgegeben. – LotPings

+0

Haben Sie es versucht? Denn ich versuche es gerade jetzt und sehe keinen Unterschied im Verhalten, so wie ich es erwartet habe. In Ihrem Code '$ choices [$ i]' ist bereits Array mit zwei Elementen. Es gibt keinen Grund, diese Elemente separat zu verwenden und ein neues Array daraus zu erstellen, wenn Sie nur das ursprüngliche Array verwenden können. – PetSerAl

Verwandte Themen