Windows环境variables和手动registry编辑 – 没有/错误的值问题

打开regedit.exe ,导航到HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment 。 创build两个环境variables

 Name Type Data ----- -------------- ----------- zbar REG_SZ water zfoo REG_EXPAND_SZ %zbar% 

打开新的cmd.exepowershell.exe或其他。 这些variables缺失 。 做LogOff,然后LogOn。 在cmd.exe窗口中inputecho %zbar% – 显示water 。 显示typesecho %zfro% ….. %zbar% ,但我希望看到扩展值 – water

现在。 打开Windows 环境variables对话框。 修改或创build任何variables(例如zzz=zzz )。 重新打开cmd.exe并inputecho %zfro% – 现在你看到water

其实,我正在使用PowerShell脚本创build这些variables。 但是这个脚本所做的就是描述registry操作。

问题:

  1. 如何强制zfoovariables没有魔法打开Windows 环境variables对话框和改变一些variables有一个正确的值? 也许我应该调用一些API,像[Microsoft.Win32.Registry]::Refresh()
  2. 可以使这些variables对用户可见而不需要LogOff / LogOn操作? 如果我编辑用户级环境variables(也在registry中),它们立即可用,但与全球 – 他们不是。

谢谢。

您需要广播 WM_SETTINGCHANGE消息 。

记住:当你修改registry时,你并没有设置任何forms的任何环境variables。 环境variables是每个进程内存空间的一部分,每个进程都有自己的设置。 他们不住在registry中。 你正在改变一个模板 。 您需要说服设置实际环境variables的程序重新读取模板并相应地设置其环境。 通过广播Windows消息来告诉任何感兴趣的人,registry中的模板已经改变。 微软的Windows资源pipe理器就是这样一个感兴趣的团体,每当它听到模板发生了变化,就会修改自己的环境variables。 然后这些修改以正常的方式被Explorer生成的任何新进程inheritance。

你可以使用SETX,它将在设置variables后广播WM_SETTINGCHANGE:

 SETX VAR VALUE /M 

或者,如果您坚持要将variablesinput到registry中,则可以让SETX设置一个已经存在的variables,以便广播registry更改:

 SETX OS %OS% /M