2016-11-16 14 views
1

저는 훌륭한 스크립터가 아니며, 번역에서 길을 잃었습니다. 어쩌면 저는 완전히 잘못된 생각을하고 있습니다 ...Powershell - 1 월에서 12 월까지 사용자의 선택 가능

저는 스크립트를 작성하고 사용자가 선택 목록, 특히 올해의 달에서 선택하기를 원합니다. 이 결과는 나중에 스크립트에서 사용됩니다. 그러나

$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)) 

, 나는 오류가 점점 계속 : 여기

은 조각의

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:

내가 누락 모르겠어요를 ... 그리고 나는 가능성이 만들고있어 필요 이상으로 복잡한 ...하지만 끝 변수 $ result는 "04-April"와 같아야합니다.

내가 여기에 무엇을 놓치고 있는지 알 수 있습니까?

+0

을 가지고 어떤 의미를하지 않습니다. 'ChoiceDescription []'은 배열입니다. MSDN [예제] (https://msdn.microsoft.com/en-us/library/system.management.automation.host.pshostuserinterface.promptforchoice (v = vs.85) .aspx)의 예제를보십시오 – gravity

+1

선택 항목이 너무 많아서 코드 리팩터링을 고려해 볼 수 있습니다. $ result = $ options | Out-GridView -Title "항목 선택"-OutputMode Single 은 원하는 동작을 제공합니다. –

+1

@gravity 배열은 [Collection]에 [this constructor] (https://msdn.microsoft.com/en-us/library/ms132401.aspx) 및 단일 차원 0 기반 배열이 있기 때문에'Collection'으로 암시 적으로 변환 될 수 있습니다. 'IList'의 제네릭 버전을 구현하십시오. – PetSerAl

답변

2

옵션 변수를 보면 $ option4 다음에 쉼표 대신 마침표가 표시됩니다.

수정하면 제대로 작동합니다.

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

grrr ... 내가 그걸 놓친 걸 믿을 수 없어. 고마워. – TheCleaner

1

이 변형은 효과가 있으며 중복되지는 않습니다. & 앰퍼샌드 선택으로 선택하는 편지를 표시하지 않고

# 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) 

당신은`Collection` 아닌 배열을 전송해야이 출력

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, 당신은'$ choices [$ i] [0], $ choices [$ i] [1]'을 단지'$ choices [$ i]'로 대체 할 수 있습니다. – PetSerAl

+0

@PetSerAl 죄송 합니다만, 아니요, 그러면 [0]과 [1] 모두를 출력합니다 – LotPings

+0

시도해 보셨습니까? 왜냐하면, 나는 지금 당장 그것을 시도하고, 행동에서 차이가 없다는 것을 알았습니다. 귀하의 코드에서'$ choices [$ i]'는 이미 두 개의 요소로 배열되어 있습니다. 원래 배열을 사용할 수있을 때 해당 요소를 개별적으로 가져와 새 배열을 만드는 이유가 없습니다. – PetSerAl