我来自这里。我的问题是关于从不同的会话获取环境变量更新。如果我在一个用户会话中更新系统环境变量,我发现其他会话必须注销/登录才能应用更改。但如果我只是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);
更多信息: