LoginSignup
13
9

More than 5 years have passed since last update.

PowerShell で peco (インタラクティブ・フィルタリングツール)っぽいものを作った

Last updated at Posted at 2016-02-20

下記のような感じで PowerShell で peco っぽいものを作った。なお、選択機能は実装されていない:scream:

Animation 1.gif

:question:なぜ作った

そのまま peco 使えばいいじゃん

peco は、テキストストリームを扱うコマンドであって、PowerShell のオブジェクトを扱うコマンドではない。そのため、Where-Object のように、オブジェクトをオブジェクトのままフィルタリングすることができない。そのままオブジェクトとしてフィルタリングできるコマンドが欲しかったので作った。

Out-GridView -PassThruで十分じゃん

全くその通りだし、普通は豊富なフィルタリング機能を持つOut-GridViewを使うべき。ただ、折角 CLI 使ってるのに GUI に頼りたくないという思いがあったので作った。

:star:使い方

リンク先(Gist)の、各ファイルをローカルで作って、poco.psm1 をインポートすれば使えるようになる。

:pencil:クエリの書き方

:の後にフィルタリングに使用したいプロパティ名を記述する。そのプロパティ値と比較したい単語を半角スペース区切りで後ろに記述する。なお、各条件は論理積(and) で結合される。
例えば、:name chrome :id 5は、Where-Object {$_.name -match 'chrome' -and $_.id -match '5'}のように解釈される。

Animation 1.gif

:のみの一文字の後、あるいはクエリの先頭に:で始まらない単語を記述すると、それらの単語は直接オブジェクトと比較される。
例えば、powershellWhere-Object {$_ -match 'powershell'}のように解釈される。

また、Alt+Rを押すとフィルタリングに使用される比較演算子を切り替えられる(match, like, eq)。更に、Alt+Cで c を、Alt+Iで not を付けたり外したりできる。そのため、比較演算子には match, cmatch, notmatch, cnotmatch, like, clike, ... が使える。

Animation 2.gif

:musical_keyboard:キーマッピング

リンク先(Gist)の poco_key.ps1 を参照のこと。(実装されてない機能にもマッピングされてたりする。)

:snowflake:コード

コードは Gist に貼ってある。なお、実装はオセロゲームを作ろう(1) - PowerShell Memo をコピペしてるので、コードを追うならオセロゲームの方の解説を先に読んだほうが良い。

:poop:イケてない部分色々

  • 入力に対して反応が遅い

    • オブジェクト数が多いともっさりする
  • ページングができない

    • 先頭付近のオブジェクトしか確認できない
  • 選択ができない

    • クエリを頑張らないと目的のオブジェクトのみを拾えない
  • :をエスケープする術を用意していない

    • 正規表現なら[:]とか書けるけど
  • タブ補完がない

    • 長いプロパティ名を頑張って打つしか無い
    • プロパティ名を暗記していないと使えない
  • 特殊キーの入力が排除されていない

    • Windowsキーとか押すと文字として認識される

正直、実用的なコマンドレットを誰かが作ってくれることを期待している:stuck_out_tongue_closed_eyes:

13
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
9