説明

WindowsのパッケージマネージャーにはWinget、Chocolatey、Scoopなどがあります。
好きなものを使えばよいのですが、私自身はScoopを使っていてこのサイト内でも何度か 薦めています。Scoopは極力システム環境を汚さないコンセプトが気に入っていますが、 シェルコマンドをインストールするとPPx上で扱いづらいという欠点があります。
この記事ではScoopのshimとシェルコマンドの相性のわるさの説明と、その改善策を考えます。

shimとはWindowsに搭載されているApplication Compatibilityというしくみのことで、 実行ファイルのリンク機能のようなものです。Scoopではこの機能を使って環境変数の 登録を最低限に抑えています。shimを使った実行ファイルの管理はGUIアプリケーション ではおおむね問題ありませんが、シェルアプリケーションではcmd.exeを経由するため 一瞬DOS窓がちらつきます。
PPxは%Oオプションを設定すればDOS窓を隠せますが場合によってはコマンドの戻り値を 得られませんし、シェルコマンドが直接実行されないのはパフォーマンス面でも問題があります。

以下は対策案とコメントです。

  • Scoopの使用をやめる
    • 手っ取り早い方法です。本末転倒なのでこの選択はなしです
  • シェルコマンドのインストールだけ手動で行う
    • アップデートの手間を省きたいのでこれもなしです
  • 実行ファイルのパスを調べてエイリアスに登録する
    • 妥当ですがエイリアスの管理が面倒くさそうです

そんなわけで、

  1. 環境変数(エイリアス)にコマンド名が登録されていればそれを返し、
  2. なければ実行パスを探し、
  3. 実行パスがshimなら実際のパスを検出し、
  4. エイリアスに登録、または環境変数に一時登録したうえでパスを返す

といった機能を持つ対策スクリプトを作りました。
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対応ですが試行していません。
エラーが出るとすれば文法ミスです。修正して使ってください。