Windows XPには「ファイル名を指定して実行」なる便利な機能がある(Vista以降でも使えるがUACの「管理者権限として実行する」を実現する機能が無いためイマイチ使えない)。今日はこの機能の検証をしてみたい。

こいつの動きをよく観察すると、以下のような事がわかる。

  1. こいつを実行する時(と言うかその親プロセスとなるタスクバーを表示しているexplorer.exe)のカレントパスはおそらく%USERPROFILE%である。
  2. ショートカット(拡張子LNK)も反応する。
  3. PATH環境変数の順番に、ショートカットやEXEを探す。さらに、PATH環境変数のパスごとにドキュメント(txtとか)も探し、フォルダーにも反応する(たとえばdriversと打つと、C:\Windows\System32の中にあるdriversフォルダーが開かれる)。
  4. \\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App PathsにサブキーでEXEファイル名を入力し、規定の値にプログラムのフルパス、Path値にカレントパスを設定したものにも反応する。

ところで、こいつはこいつで便利なのだが、キーボード入力大好きっ子さんであるあんもちさんはこいつに負けず劣らずcmd.exeを多用する。ところが、cmd.exeだと2と4が反応しない。3のPATHの中にあるフォルダーはどうでも良いが、2と4が使えないのは痛い。そこで、cmd.exeも少しだけ使いやすくカスタマイズしてみる。

その1.PATHEXTにLNKを追加する。
環境変数PATHEXTというのは、ここに登録してある拡張子は拡張子を指定せずに反応するものだ。ここにLNKを追加する事で、cmd.exeでもショートカットに.lnkをつけなくても反応するようにする。Windows XP、Vista、7の場合、環境変数の設定にはユーザー環境変数とシステム環境変数があるが、後述のPATH以外はシステム環境変数とユーザー環境変数で同じ名前のものがあるとユーザー環境変数が正となる。正確にはシステム環境変数の設定→ユーザー環境変数の設定という動きをするようで、ユーザー環境変数のみが残る事になるようだ。なのでユーザー環境変数に入れる場合は「%PATHEXT%;.LNK」としてシステム環境変数のPATHEXTを殺さないようにする。

その2.PATHの先頭に%USERPROFILE%を入れる。
Windowsがプログラムやドキュメントを走査する順番は、UNIX系と違いPATH環境変数の前にカレントパスが来る。ファイル名を指定して実行はカレントパスが%USERPROFILE%だと思われるので、走査の最初は%USERPROFILE%だ。で、それは良いのだがcmd.exeはカレントパスがころころ変わるのでPATHの先頭に%USERPROFILE%が来るようにしたい。先ほど環境変数の説明をしたが、PATHは特別でシステム環境変数、ユーザー環境変数の順番でマージされたものが設定される。なのでユーザー環境変数PATHの先頭に%USERPROFILE%を持ってきてもシステム環境変数の後になってしまうが、システム環境変数は%USERPROFILE%が反応しない。仕方なくレジストリーの\\HKEY_CURRENT_USER\Software\Microsoft\Command ProcessorにAutoRun値を作成し、データにPATH %USERPROFILE%;%PATH%と入力してcmd.exe起動時にPATH先頭に無理やり突っ込む。後は%USERPROFILE%の中に良く使うプログラムへのショートカットをつくり、打ちやすいファイル名に変更する。さくらエディターを%USERPROFILE%\sakura.lnkとして作るとファイル名を指定して実行でもcmd.exeでも「sakura」で反応するようになるわけだ。
ところで、DOSプログラム(コマンドプロンプトの中で動作するプログラム)の場合はこの方法だとうまくいかないので、プログラムが入っているパスを個別にPATHの中に入れてあげる方が無難だろう。小さなツールの場合はC:\usr\local\binなどを作ってそこに全部まとめていれてあげる。C:\Users\<ユーザー名>\binの方がいいかも知れない。

これで、PATH環境変数も増えすぎず(MAX1024バイトだそうだ?)、ファイル名を指定して実行とcmd.exeで少ない打鍵でいろいろなプログラムを起動できるようになった。