以编程方式刷新 PATH 中的环境变量引用 (Windows 10)

Programmatically Refreshing Environment Variable References in PATH (Windows 10)

背景

我有一个 Python 脚本可以将环境变量设置到注册表中,然后 broadcasts an update using the WinSDK 告诉系统变量已更新。这类似于 setx 和手动环境变量 UI。这在 Windows 7.

中非常有效

然而,在 Windows 10 中,几乎 有效。

这是我的问题

  1. 我设置了一个环境变量(XXX = c:\my_dir)
  2. 然后我通过注册表将对 XXX 的引用插入到 PATH 变量中。我确保使用 REG_EXPAND_SZ 类型。
  3. 然后我广播更新。
  4. 当我重新启动一个新的 cmd.exe shell 时,我可以看到我的新变量 XXX (echo %XXX%),但是,当我查看 PATH 时,对 XXX 的引用没有正确展开.
  5. 为了让我的路径更新坚持下去,我需要手动进入环境变量 UI 和 "edit" 路径,或者我需要登录并注销。

奇怪的是这只影响 PATH。如果我将我的引用添加到另一个变量(例如 PYTHONPATH),一切似乎都按预期工作。

我试过的

更新环境代码

import ctypes

def update_environment():
    """Uses ctypes to send a message to all windows that the environment has
    been updated. This has the same effect as pressing the 'OK' button in the
    windows environment variables dialog.

    References:
        https://support.microsoft.com/en-us/kb/104011"""
    wm_settingchange = 0x001A
    hwnd_broadcast = wintypes.HWND(0xffff)
    smto_abortifhung = 0x0002
    env_message = ctypes.create_unicode_buffer('Environment')
    result = ctypes.windll.user32.SendMessageTimeoutW(hwnd_broadcast,
                                                      wm_settingchange,
                                                      0,
                                                      env_message,
                                                      smto_abortifhung,
                                                      5000,
                                                      0)
    return result

问题

是否有任何其他已知方法强制 windows 10 刷新环境(特别是 PATH 中的环境引用)?

我弄乱了一些东西,发现了(我认为)问题所在。

基本上,我设置的每个注册表项都是 REG_EXPAND_SZ 类型。在 Windows 7 中,这似乎工作正常。但是,这不会强制我的变量在 Windows 10 中重新扩展,除非我的 XXX 键设置为 REG_SZ。如果我这样做,那么 windows 将正确更新变量引用。