関連付けで環境変数を使う

関連付けでファイルを開こうと思ったら

指定されたデバイス、パス、またはファイルにアクセスできません。
アクセス許可がない可能性があります。

と言ってきやがる。

FileTypesMan *1 で見る限り、どこにも異常はない。面倒くさいがレジストリを直接見る。

C:\>reg query HKCR\txtfile\shell\open2\command

HKEY_CLASSES_ROOT\txtfile\shell\open2\command
(既定) REG_SZ %SystemRoot%\system32\NOTEPAD.EXE %1

デフォルトのverbはopen2にしてある。一見したところ、どこにも問題がないように見える(メモ帳の場合 %s は " で囲う必要がない)。そもそも Process Explorer *2 で見る限り、エラーメッセージを出しているのはメモ帳ではないようだ。

ちょっと他を見回してみると、すぐに気づいた。環境変数だ。ちゃんと展開させるには、 REG_SZ (文字列値)ではなく、 REG_EXPAND_SZ (展開可能な文字列値)にする必要がある。

C:\>reg add HKCR\txtfile\shell\open2\command /ve /t REG_EXPAND_SZ /d ^"%^SystemRoot%\system32\NOTEPAD.EXE^ %1"
値 は存在します。上書きしますか? (Yes/No) yes
この操作を正しく終了しました。

%エスケープが難しいので、GUIレジストリ・エディタを使ったほうがいいかも。

*1:関連付けを編集するソフトです。

*2:タスク・マネージャの強化版です。