$host.UIにあるPromptメソッドを調べてみた。
だいたいコマンドレットでもみかけるようなメソッドが並んでいるが、その中でPromptというのは見かけない感じ。
調べてみると、ユーザー入力を受け取るときに使うメソッドのようだ。
ReadLineと違ってこちらは複数項目を続けて受け取れる。
なんか見ただけで嫌になってくる(笑)
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 " : "} | </
せっかく苦労したのでもう少し調べてみる。
そもそもこれだけの機能であれば、[System.Management.Automation.Host.FieldDescription]を使わずともStringで良い。
そこでこのクラスのメンバーを見てみると、
なにやらDefaultとかも指定できる風。
そこで6行目を以下のようにしてDefaultValueとHelpMessaeを追加してみた。
$questions | %{$descriptions.Add(( |
予め、値にDefault値がセットされ、HelpMessageがツールチップで表示される。
ん~、なかなか高機能。
せっかく苦労したのだからこれくらいはやってもらわないと、っとちょっと満足しかけたのだが本家PowerShellではこんな表示になってしまう。
Defaultは何処へやら・・・。だめだこりゃ!!(ISEもダメ)
PowerGUIの実装に負けているということか・・・。
ならば、IsMandatoryを指定して必須にしちゃうかと思ったがこちらも効かないっぽ。
0 件のコメント:
コメントを投稿