EmEditor (64-bit) 15.1.2 をインストールしたらシステムのPATH環境変数を綺麗さっぱり消されました。 robocopy とか実行しようとしたら、そんなコマンドないよなんて言われやがるので、なんで??っていう感じになって、システムの環境変数を見てみたら、
うわぁー、どう考えても、犯人は、 EmEditor じゃないですか・・・。
システムの復元を試みる
PATH環境変数を元に戻そうにも、そんなもの、内容覚えている訳ないじゃないですか。
さーて、落ち着け。こういうときは落ち着くのが一番大事。
どうするんだっけ。こういうとき。
あー、使ったことがないシステムの復元という機能がある。実行してみよう。
そうです。今日の朝ぐらいにノリでアップデートしたそいつです。多分、そいつが犯人です。
一応、内容を確認。
はい。間違い有りません。そして、その内容で復元してくれるなら復元して欲しいです。
ということで、しばらく待っていたんですが、復元できませんね。
仕方が無いので、
ここから起動時に復元を試みましょう。
はーい。無理。
復元ポイントのデータから直接データを取得する
じゃぁ、アプローチを変えて、復元ポイントのデータから無理矢理PATHの値を取れないかな?
hidekiy blog: [windows] 復元ポイントに保存されたレジストリを閲覧する
少し昔のレジストリがどうなっていたかだけを知りたい場合には、C:\System Volume Information\_restore{GUID}\RPxxx\Snapshot の中に入っているレジストリハイブのスナップショットを使えばよいです。
はーい、C:\ にはそんなディレクトリはないか、あるいは、一般ユーザー(管理者)にもアクセス出来ないかどちらかの様です。この情報は Windows 8.1 では使えないみたいですね。
さて、
要は、レジストリハイブに対応する C:\Windows\System32\config\RegBack\SYSTEM っていうファイルの古いバージョンをレジストリエディタでロードしたら、中身が参照できるから、そこからPATHの古い値を取れるよっていう分かりやすい話。
なるほど。こっちは使えそうな話かな?って思っていると、
Special thanks to Microsoft for removing "Restore Previous Versions" from Windows 8.
えーーーーー。確かに、Windows 8にはこのUIはない。
ということでこの先の記事も一応見てみる。
Previous versions UI removed for local volumes (Windows)
simpliusさんのコメントに、
Use Shadow Explorer, \\localhost\c$ doesn't (always) work
とある。おー、そんなソフトがあるのか。
で、おー、確かに古いバージョンのレジストリハイブのファイルをエクスポートできる。
で、これをレジストリ エディターでロードします。ちょっとだけ分かりにくいので説明しておくと、最初に、HKEY_LOCAL_MACHINEとかを選択しないと、「ファイル - ハイブの読み込み」がグレーアウトしたままになります。
で、「ファイル - ハイブの読み込み」からさっきエクスポートした SYSTEM ファイルを読み込みます。で、名前を適当に決めないと行けないので、 SYSTEM.old とでもしておきます。
そうすると、次みたいな感じになるので、
ここから、
HKEY_LOCAL_MACHINE\SYSTEM.old\ControlSet001\Control\Session Manager\Environment
と辿っていくと、
やっと、古いPATHの値にたどり着きました。これをエクスポートするなり、コピペするなりすれば、元のPATHが復活できます。
僕の場合、この値は、
C:\Program Files\Cuminas\Document Express 8 Enterprise\;X:\\bin;C:\Program Files (x86)\Cuminas\Document Express DjVu Plug-in\;C:\Program Files (x86)\Python27\;C:\Program Files (x86)\Python27\Scripts;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Common Files\Sony Shared\FeliCaLibrary;C:\Program Files\Common Files\Sony Shared\FeliCaLibrary;C:\Program Files (x86)\Common Files\Sony Shared\FeliCaNFCLibrary;C:\Program Files\Common Files\Sony Shared\FeliCaNFCLibrary;C:\Program Files\TortoiseSVN\bin;C:\Program Files\EmEditor;C:\Program Files\Microsoft\Web Platform Installer\;C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files (x86)\Microsoft SDKs\TypeScript\1.0\;C:\Program Files\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files (x86)\nodejs\;C:\Program Files (x86)\GtkSharp\2.12\bin;C:\ProgramData\chocolatey\bin;C:\tools\python2;C:\Program Files (x86)\Skype\Phone\;%USERPROFILE%\.dnx\bin;C:\Program Files\Microsoft DNX\Dnvm\
という値でした。1161文字。よく見ると、 %USERPROFILE% などがあるので、ExpandEnvironmentStrings で展開したりすると、1166文字。
いずれにしても、1024文字超えなので、プログラム中で、
WCHAR buf[1024]; GetEnvironmentVariableW(L"PATH", buf, 1024);
とかしてると、
If lpBuffer is not large enough to hold the data, the return value is the buffer size, in characters, required to hold the string and its terminating null character and the contents of lpBuffer are undefined.
という部分にハマることにでもなるのでしょうか。他のマシンでの再現性がないことからも、PATHの長さが問題になった可能性は否定できないと思います。
問題は、そのクソインストーラを誰が書いたのか・・・という部分ですが。
後始末
さて、レジストリ エディターですが、ロードしたハイブは自動的にはアンロードされません。
先ほどの SYSTEM.old を選択して、「ファイル - ハイブのアンロード」をしておきましょう。
EmEditorのサイトに繫がった
さっきまで、EmEditorのウェブサイトが落ちていたのですが、今、改めて接続してみると、
そのものズバリの問題が見つかりました。
で、アップデート版があるみたいです:
v15.1.1 のインストールにてシステム環境変数「Path」の中身が消える - EmEditor (テキストエディタ)
だからといって、救われるわけではないんですけどね。
既にやっちまったユーザーに対しての修復方法なりの説明は必要ではないでしょうか。