如何从不同的用户会话刷新环境变量的变化?

如何从不同的用户会话刷新环境变量的变化?

我来自这里。我的问题是关于从不同的会话获取环境变量更新。如果我在一个用户会话中更新系统环境变量,我发现其他会话必须注销/登录才能应用更改。但如果我只是SET在其他会话中运行,我可以看到更改。但任何新进程都不会接受更改。

这是设计使然吗?有没有办法让其他用户无需注销即可获取新的环境变量?

答案1

有一个系统级 API 调用“SendMessageTimeout”,可以使用 PowerShell 进行调用:

调用 WMSettingsChange
http://poshcode.org/2049

描述:通知其他进程全局环境块已更改。这允许其他进程选择对 ENV 的更改:而无需重新启动或注销/登录。SendMessageTimeout 的非零结果表示成功。

if (-not ("win32.nativemethods" -as [type])) {
    # import sendmessagetimeout from win32
    add-type -Namespace Win32 -Name NativeMethods -MemberDefinition @"  

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr SendMessageTimeout(
   IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam,
   uint fuFlags, uint uTimeout, out UIntPtr lpdwResult);
"@
}

$HWND_BROADCAST = [intptr]0xffff;
$WM_SETTINGCHANGE = 0x1a;
$result = [uintptr]::zero

# notify all windows of environment block change
[win32.nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE,
        [uintptr]::Zero, "Environment", 2, 5000, [ref]$result);

更多信息:

https://stackoverflow.com/questions/22734043/activate-registry-changes-after-setting-new-path-environment-variable

相关内容