2016-11-16 17 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月」のようなものでなければなりません。

私はここで何が不足していると思いますか?

+0

あなたは 'Collection'、ない配列を送信する必要がありますがありません。あなたの '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配列は、[コレクション]に[このコンストラクタ](https://msdn.microsoft.com/en-us/library/ms132401.aspx)と1次元ゼロベースの配列があるため、暗黙的に '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) 

は、この出力

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

ところで、 '$ choices [$ i] [0]、$ choices [$ i] [1]'を '$ choices [$ i]'だけで置き換えることができます。 – PetSerAl

+0

@PetSerAl申し訳ありませんが、それは[0]と[1]の両方を出力します – LotPings

+0

試しましたか?なぜなら、今私はそれを試してみて、私が期待したように、行動に違いは見られないからです。あなたのコードでは、 '$ choices [$ i]'はすでに2つの要素で配列されています。独自の配列を使用するだけで、その要素を別々に取ってそれらから新しい配列を作成する理由はありません。 – PetSerAl

関連する問題