.bat ファイルの右クリックメニューを追加する。
Editで開くと、メモ帳になって不便なので、適当なエディタ(今回はVsCode)で開くようにした。
.bat ファイルのコンテキストメニューについての留意点
.bat ファイルのメニューを操作する前に知っておくべきこと。
いくつかの注意点があるので、備忘録として残しておく。
HKCU:\SOFTWARE\Classes\batfile
を触る。
.bat ファイルは、拡張子.bat
だが、レジストリではbatfile
として登録されている。
拡張子で触るのではなく、batfile のエントリを触る。そして可能な限りHKCU
で触る。
OpenWith系やダブルクリックは使用不可
OpenWith やOpenなどのdefault挙動を変えてはいけない。なぜなら、.batファイルをダブルクリックでコマンドとして実行する必要がある。そのため、標準の挙動を変えると起動するべき.batファイルが起動せずに、おかしなことになる。
もちろん、現代に於いて、.batファイルを利用したソフトウェアを標準配布するなど皆無に等しいため、変えても構わないはずだが、WindowsではOpenWithProgid
を指定しても、OpenWithを変えることが出来ない。制限事項である。
.regファイルや.exeファイルとの比較
.batと似たようなシステムファイルの例として、regfile(レジストリ・ファイル)がある。
レジストリファイル(.reg)の場合は、OpenWithが利用可能である。
なぜなら、.regファイルを実行(登録)するには、regedit.exe
を通すので、実行するexeを指定できる。
ところが、.batファイルは「ファイル自身」が実行対象になるため、OpenWithするexeがないことになる。
cmd.exeで開けばいいとか、persiste handler を変えたり、open を変えれば不可能ではないが、やるべきではない。
batfile ファイル形式は、次のように自分自身を実行するようにopen
で定義されている・
batfile の定義(自分自身が実行対象)
%1 %*
となり自分自身が実行対象であることがわかる。
コレは、.exeのexefile と同じ定義である。
exefile の定義(自分自身が実行対象)
bat と同じ定義である
このようなことから、OpenWith(関連付けの変更可能ファイル)として設定することは無意味であるし、するべきではない。
shell / shellex
を通して、メニューを追加するに留めるわけです。
エントリの追加
上記を踏まえた上で、エントリを追加する。
## vs code 開くに追加 ## .bat New-Item -Path 'HKCU:\SOFTWARE\Classes\batfile' -ItemType Directory New-Item -Path 'HKCU:\SOFTWARE\Classes\batfile\shell' -ItemType Directory New-Item -Path 'HKCU:\SOFTWARE\Classes\batfile\shell\VSCode' -ItemType Directory New-Item -Path 'HKCU:\SOFTWARE\Classes\batfile\shell\VSCode\command' -ItemType Directory New-ItemProperty -Path 'HKCU:\SOFTWARE\Classes\batfile\shell\VSCode' -Name 'Icon' -Value "C:\Users\takuya\AppData\Local\Programs\Microsoft VS Code\Code.exe" New-ItemProperty -Path 'HKCU:\SOFTWARE\Classes\batfile\shell\VSCode\command' -Name '(Default)' -Value '"C:\Users\takuya\AppData\Local\Programs\Microsoft VS Code\Code.exe" "%1"'
icon について
icon を入れると次のように、コンテキスト・メニュにアイコンが見える
vscode のインストール場所に注意
Vscode はユーザ空間と、システム全体(グローバル)のどちらかにインストールされるが、基本的にはユーザ空間である。 まれにシステム全体になっていることがあるので注意する。
まとめ
BATファイルは、右クリックメニューのShell(またはShellEx)でメニューを登録するしか無い。
.batのOpenWithを使うと標準起動が変わってしまうので、OpenWithは使うべきではないし、使えない。