我来自这里 。 我的问题是关于从不同的会话获取环境variables更新。 如果我在一个用户会话中更新系统环境variables,我发现其他会话必须注销/应用更改。 但是如果我在其他会话中运行SET ,则可以看到更改。 但是,任何新的过程都不会带来改变。
这是行为的devise? 其他用户是否有办法在不注销的情况下获取新的环境variables?
有一个系统级的API调用“SendMessageTimeout”,可以使用PowerShell进行PInvoked:
调用-WMSettingsChange
http://poshcode.org/2049
说明:通知其他进程全局环境块已更改。 这可以让其他进程select更改为ENV:无需重新启动或注销/login。 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);
更多信息: