2011年10月28日金曜日

◆$host.UIのプロンプト入力機能を使う

$host.UIにあるPromptメソッドを調べてみた。

$host.UIのメンバーはこんな感じ。
image

だいたいコマンドレットでもみかけるようなメソッドが並んでいるが、その中でPromptというのは見かけない感じ。

調べてみると、ユーザー入力を受け取るときに使うメソッドのようだ。
ReadLineと違ってこちらは複数項目を続けて受け取れる。

定義を見てみると、
image

なんか見ただけで嫌になってくる(笑)

CaptionとMessageとDescriptionを指定するとDictionaryが返って来る。
CaptionとMessageはStringだから良いとして、DescriptionはCollection ジェネリック クラス (System.Collections.ObjectModel)という事で、ジェネリッククラス。
なので前回調べたジェネリックの作成方法を使う。

また、Collectionの中身がSystem.Management.Automation.Host.FieldDescriptionなのだろうからこれを調べるとString引数をひとつ取るコンストラクターになっている。
どうやら、それがユーザー入力項目の名称になりそうだ。

いろいろ試行錯誤した結果、とりあえず以下のような感じでそれらしいPromptになった。

</
001
002
003
004
005
006
007
008
009
010
011
012
013

$dClass = [System.Management.Automation.Host.FieldDescription]
$cClass = "System.Collections.ObjectModel.Collection"

$descriptions = New-Object "$cClass``1[$dClass]"
$questions = "国名","都道府県名","市区町村名"
$questions | %{$descriptions.Add((New-Object $dclass $_))} 
$caption = "<ユーザー入力>" 
$message = "質問項目に回答願います。"
 
 

$result =  $host.UI.Prompt($caption, $message, $descriptions) 
Write-Host "`n入力確認。" 
$result.GetEnumerator() |
 
 
%{write-host $_.key $_.value -Separator " : "}

image

せっかく苦労したのでもう少し調べてみる。
そもそもこれだけの機能であれば、[System.Management.Automation.Host.FieldDescription]を使わずともStringで良い。
そこでこのクラスのメンバーを見てみると、
image

なにやらDefaultとかも指定できる風。
そこで6行目を以下のようにしてDefaultValueとHelpMessaeを追加してみた。

$questions | %{$descriptions.Add((
  New-Object $dclass $_ -Property @{DefaultValue="未入力";HelpMessage="ヘルプです"}
))}

するとPowerGUIではこんな感じに表示される。
image

予め、値にDefault値がセットされ、HelpMessageがツールチップで表示される。
ん~、なかなか高機能。
せっかく苦労したのだからこれくらいはやってもらわないと、っとちょっと満足しかけたのだが本家PowerShellではこんな表示になってしまう。
image

Defaultは何処へやら・・・。だめだこりゃ!!(ISEもダメ)

PowerGUIの実装に負けているということか・・・。

ならば、IsMandatoryを指定して必須にしちゃうかと思ったがこちらも効かないっぽ。

0 件のコメント:

コメントを投稿