hack のためのネタ帳, etc,,,

状況

で既に解決済みだが、 「システムのプロパティ」ダイアログの「詳細設定」タブ(SystemPropertiesAdvanced.exe)から、「環境変数」 ダイアログ開いて環境変数変更すると、変更が即座に explorer.exe に反映されるのに、reg.exe や PowerShell の Set-ItemProperty で変更すると、explorer.exe 再起動するか「環境変数」 ダイアログの「OK」ボタン押すまで explorer.exe に反映されない。

原因

によると、explorer.exe は WM_SETTINGCHANGE 受け取ると、BOOL RegenerateUserEnvironment(WCHAR**, BOOL); 叩いて環境変数刷新するらしいのだが、reg.exe や Set-ItemProperty はそれを投げてくれないようだ。

解法

とりあえず、WM_SETTINGCHANGE 投げれば OK っぽいのだが、
WM_SETTINGCHANGE powershell」でググると、以下のページの機械翻訳で断片化したページを見つけた。

なんでも、自分で WM_SETTINGCHANGE 発行しなくても、[Environment]::SetEnvironmentVariable(string variable, string value, EnvironmentVariableTarget target) で書き換えれば自動的に投げてくれるらしい。
ところが、こいつは、REG_SZ 限定。REG_EXPAND_SZ で書けない。

[Environment]::SetEnvironmentVariable REG_EXPAND_SZ」でググると とかで [Microsoft.Win32.Registry]::SetValue(string keyName, string valueName, object value, Microsoft.Win32.RegistryValueKind valueKind) が提案されてたりするが、こちらは WM_SETTINGCHANGE を投げてくれない。

しばらく悩んだが、与えた変数名に値として空文字列与えれば結果的にその変数名の環境変数が削除されるので、以下のようにするのが一番手間要らずというのが結論じゃないかと思う。
[Environment]::SetEnvironmentVariable("WM_SETTINGCHANGE","","User")

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます