F#でコマンドレットを書いてる pt.2
krymtkts/pocof の話。
平日仕事の方ばっかりやってるので亀な進捗だ。
ひとまずSystem.Management.Automation.WildcardPattern
の使い方がわかった のを皮切りに、 -like
,-match
,-eq
あたりのフィルタを実装した。
あとプロパティを指定しての絞り込みとかを実装してないが、これは PSObject
から目当てのプロパティを拾ってマッチするだけなので、多分むずくないだろう。
いま一番頭を悩ませている課題は、絞り込みを確定するまでの間印字する内容についてだ。
やはり PowerShell でインタラクティブなフィルタリングをするのであれば、印字する内容も PowerShell の Format-Table
ライクな印字をしたい。
例えば Terminal-Icons を使っていたら、カラフルな Get-ChildItem
の結果のママ絞り込みしたい。ただそのやり方がさっぱり分からない。
全くわからんなりに、とりあえず F# 内から PowerShell を実行する練習として、 PowerShell.Create
でコマンドレットを動かしてみただけというコードは動かしてみた。
[<Cmdlet(VerbsDiagnostic.Test, "Pocof")>]
[<OutputType(typeof<PSObject>)>]
type TestPocofCommand() =
inherit PSCmdlet()
override __.EndProcessing() =
__.WriteObject
<| PowerShell
.Create()
.AddCommand("Get-ChildItem")
.AddCommand("Format-Table")
.Invoke() // まじで意味ない
このへんまだ調査不足のため、以下に記すのはメモ書きレベル。つか PowerShell Class だけでなく PowerShell SDK のドキュメントむずくない? 全体的に読んでてもよくわからん(愚痴)。
これをやろうとしたら Format.ps1xml が反映された状態の文字列を F# 内で作らないといけないが、 F# 内で
PowerShell.Create
したとてセッションの引き継ぎができるのかがわからんPowerShell.Create あたりでどうにかなりそうに見えるけど試せてない
PowerShell SDK の中には
FormatTableCommand
という名のまさにFormat-Table
そのものがあるが、こいつの Input にSelectPocofCommand
からデータを食わす方法がわからんこれも多分実行時に引数で渡せるようにみえるけど(略) PowerShell.Invoke Method
これらが想定通りで期待の Output が得られたとて、正直な気持ちは F# 内で PowerShell の実行エンジン作ってまでやりたくないなー(なんか重そう)、もっと簡単に
Format-Table
の出力を得る方法はないんかいな、というお気持ち
System.Management.Automation.WildcardPattern
みたいな外部から見える場所に PowerShell 内部で使ってる機能がいい感じに提供されてたらいいのだけど、そんな感じではなさそう。
見た目に動きのある機能実装ができたときの嬉しさはやっぱひとしおなので、取り組みたい、けどまだ情報&能力的に不足してるなーというところ。何やるにしても手を動かせるまでに異様に時間がかかる。 ひとまずは調査継続しつつ他の課題潰していくか。
ほんま仕事とは一切接点無くて趣味プロとして最高のテーマになってる。