この記事は PowerShell Advent Calendar 2019 の 23日目 の記事だ。
日程が埋まりきっていなかったので、適当な内容で埋めていこう。
あなたは、 PowerShell の短いコードを、 デスクトップのアイコンをクリックするのも億劫なほど、手軽に実行したいと思ったことはないだろうか?
ないって?
私はある。
例えば、ブラウザなどでコピーして WYSIWYG エディターにペタリと貼り付けるときに、クリップボード内の装飾情報を削除したいとか。
(Get-Clipboard -TextFormatType UnicodeText -Raw) -replace '^[ \r\n\t]*|[ \r\n\t]*$','' | Set-Clipboard
PowerShell なら上記のような一行コード実行すれば済む話だ。 しかし、 ウィンドウをシェルに切り替えたり、 ショートカットクリックするのも面倒。 タスクトレイのアイコン一つクリックして実行できたらいいのに。
はい、それを叶えます。
ベースのコード
これを、スタートアップフォルダのバッチファイルなどで、こんな感じで実行する。
start "" powershell -WindowStyle Hidden .\Register-TaskTrayScripts.ps1 -Script "{ (Get-Clipboard -Raw) -replace '^[ \r\n\t]*|[ \r\n\t]*$','' | Set-Clipboard }" -ARGB 0x008080
すると、タスクトレイにアイコンが現れる。
こいつをクリックすれば、 -Script パラメータで指定したコードが実行されるという算段だ。
複数のスクリプトを使い分けたければ、 -ARGB パラメータでアイコンの色を変えて複数のスクリプトを指定すれば OK だ。
常駐を修了させたいときは、 タスクトレイのアイコンを右クリックして Exit でどうぞ。
ちょっと解説
基本的には、 System.Windows.Forms で登録した通知アイコンがクリックされたら、 スクリプトブロックを実行しているだけだ。
適当に作った極小 .ico ファイルを、 Base64 でソースコードに埋め込むことで、通知アイコンの画像を実現している。
この .ico ファイルは、インデックスカラーの PNG を抱えており、 そのインデックスの色をバイナリ上で書き換えることで、アイコンの色変更を実現している。
泥臭いね。
その色を指定している ARGB パラメータの内容で、 多重起動制御用のミューテックスを作成している。
このため、同じ色のアイコンを登録しようとすると、通知アイコンを登録せずに終了するようになっている。
この仕組みのせいで、登録されるアイコンの最大数はわずか 16777216個 のみとなっている。
改訂履歴
- 2019-12-23: PowerShell 7 RC で動かない問題を修正。