プラグイン:
説明
WindowsのパッケージマネージャーにはWinget、Chocolatey、Scoopなどがあります。
好きなものを使えばよいのですが、私自身はScoopを使っていてこのサイト内でも何度か
薦めています。Scoopは極力システム環境を汚さないコンセプトが気に入っていますが、
シェルコマンドをインストールするとPPx上で扱いづらいという欠点があります。
この記事ではScoopのshimとシェルコマンドの相性のわるさの説明と、その改善策を考えます。
shimとはWindowsに搭載されているApplication Compatibilityというしくみのことで、
実行ファイルのリンク機能のようなものです。Scoopではこの機能を使って環境変数の
登録を最低限に抑えています。shimを使った実行ファイルの管理はGUIアプリケーション
ではおおむね問題ありませんが、シェルアプリケーションではcmd.exeを経由するため
一瞬DOS窓がちらつきます。
PPxは%O
オプションを設定すればDOS窓を隠せますが場合によってはコマンドの戻り値を
得られませんし、シェルコマンドが直接実行されないのはパフォーマンス面でも問題があります。
以下は対策案とコメントです。
- Scoopの使用をやめる
- 手っ取り早い方法です。本末転倒なのでこの選択はなしです
- シェルコマンドのインストールだけ手動で行う
- アップデートの手間を省きたいのでこれもなしです
- 実行ファイルのパスを調べてエイリアスに登録する
- 妥当ですがエイリアスの管理が面倒くさそうです
そんなわけで、
- 環境変数(エイリアス)に
コマンド名
が登録されていればそれを返し、 - なければ実行パスを探し、
- 実行パスがshimなら実際のパスを検出し、
- エイリアスに登録、または環境変数に一時登録したうえでパスを返す
といった機能を持つ対策スクリプトを作りました。
1つめはエイリアスにパス登録するスクリプトで、引数に複数のコマンド名を指定し
一括でパスを登録します。戻り値はエイリアス登録されたパスをカンマ区切りで返します。
2つめは環境変数に一時登録するスクリプトで、引数を1つ受け取り環境変数にコマンド名が
登録されていなければ登録し、戻り値にはパスを返します。
頻繁に利用するコマンドはエイリアス登録、使用頻度の低いものや代替コマンドに変更
する可能性のあるものは、一時登録を使えばパス管理の手間を抑えられるのではないかな
と思います。
使い方
aliasRegister.js,arg1,arg2,…
コマンド: *msgbox %*script(aliasRegister.js,cmd1,cmd2,...)
戻り値: cmd1=path\to\cmd1.exe,cmd2=path\to\cmd2.cmd,...
引数で指定した複数のコマンドを、それぞれエイリアスに登録します。
shellcmdRegister.js,arg1
コマンド: *msgbox %*run(-hide -io:utf8 %*script(shellcmdRegister.js,git) status)
戻り値: path\to\git.exe
引数で指定したコマンドを環境変数に一時登録します。
用途から考えてユーザーコマンド_Command
に登録するのが便利そうです。
*msgbox %*run(-hide -io:utf8 %*shellcmd(git) status)
設定
_User = {
shellcmd = %*script("path\to\shellcmdRegister.js",%*arg(1))
}
スクリプトはJScript5.7対応ですが試行していません。
エラーが出るとすれば文法ミスです。修正して使ってください。