Windows 环境变量和手动注册表编辑 - 无/错误值问题

Rom*_*man 4 windows environment-variables

打开regedit.exe,导航到HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment。创建两个环境变量:

Name   Type            Data
-----  --------------  -----------
zbar   REG_SZ          water
zfoo   REG_EXPAND_SZ   %zbar%
Run Code Online (Sandbox Code Playgroud)

打开新的cmd.exepowershell.exe或者什么。缺少这些变量。注销,然后登录。在cmd.exe窗口类型echo %zbar%-water显示。键入echo %zfoo%%zbar%已显示,但我希望看到扩展值 - water

现在。打开 Windows环境变量对话框。更改或创建任何变量(例如zzz=zzz)。重新打开cmd.exe并输入echo %zfoo%- 现在您看到了water

实际上,我正在使用 PowerShell 脚本创建这些变量。但是这个脚本所做的只是描述了注册表操作。

问题:

  1. 如何zfoo通过打开 Windows环境变量对话框并更改一些变量来强制变量具有正确的值而没有这种魔力?也许我应该调用一些 API,比如[Microsoft.Win32.Registry]::Refresh()
  2. 是否可以在不需要注销/登录操作的情况下使这些变量对用户可见?如果我编辑用户级环境变量(也在注册表中),它们会立即可用,但对于全局变量——它们不是。

谢谢。

Jde*_*eBP 9

你需要播放WM_SETTINGCHANGE消息

请记住:当您修改注册表时,您实际上并未设置任何形式的任何环境变量。环境变量是每个进程内存空间的一部分,每个进程都有自己的设置。他们不在注册表中。您正在更改模板。您需要说服设置实际环境变量的程序重新读取模板并相应地设置它们的环境。为此,您可以广播一条 Windows 消息,告知任何相关方注册表中的模板已更改。Microsoft Windows 资源管理器就是这样一个感兴趣的一方,它会在听到模板已更改时修改自己的环境变量。这些修改随后由 Explorer 产生的任何新进程以正常方式继承。