2022-06-12

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 からデータを食わす方法がわからん
  • これらが想定通りで期待の Output が得られたとて、正直な気持ちは F# 内で PowerShell の実行エンジン作ってまでやりたくないなー(なんか重そう)、もっと簡単に Format-Table の出力を得る方法はないんかいな、というお気持ち

System.Management.Automation.WildcardPattern みたいな外部から見える場所に PowerShell 内部で使ってる機能がいい感じに提供されてたらいいのだけど、そんな感じではなさそう。

見た目に動きのある機能実装ができたときの嬉しさはやっぱひとしおなので、取り組みたい、けどまだ情報&能力的に不足してるなーというところ。何やるにしても手を動かせるまでに異様に時間がかかる。 ひとまずは調査継続しつつ他の課題潰していくか。

ほんま仕事とは一切接点無くて趣味プロとして最高のテーマになってる。