在 Powershell 中设置后机器级环境变量不可用
Machine level environment variable not available after setting in Powershell
以下代码未按预期 return "Y"。只有在下一个会话(另一个新的window)它才有效?我希望它立即可用吗?
[Environment]::SetEnvironmentVariable("X", "Y", "Machine")
Write-Host $env:X
据我所知,一个进程只加载一次环境变量(在启动时)。但您可以使用以下方式更改它:
[Environment]::SetEnvironmentVariable("X", "Y", "Process") # for the current session
注意:您可能想同时设置两者:
[Environment]::SetEnvironmentVariable("X", "Y", "Machine")
[Environment]::SetEnvironmentVariable("X", "Y", "Process")
你必须这样做,因为进程在启动时获取环境变量,而不是在 运行 期间(即你必须重新启动 shell 才能按你的方式工作):
[Environment]::SetEnvironmentVariable("X", "Y", "Machine")
$Env:X = "Y"
还有一种方法可以使用 WM_SETTINGCHANGE
将其广播给其他 windows
To effect a change in the environment variables for the system or the
user, broadcast this message with lParam set to the string
"Environment".)
# Notify system of change via WM_SETTINGCHANGE
if (! ("Win32.NativeMethods" -as [Type]))
{
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
[Win32.Nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE, [UIntPtr]::Zero, "Environment", 2, 5000, [ref] $result) | out-null
}
以下代码未按预期 return "Y"。只有在下一个会话(另一个新的window)它才有效?我希望它立即可用吗?
[Environment]::SetEnvironmentVariable("X", "Y", "Machine")
Write-Host $env:X
据我所知,一个进程只加载一次环境变量(在启动时)。但您可以使用以下方式更改它:
[Environment]::SetEnvironmentVariable("X", "Y", "Process") # for the current session
注意:您可能想同时设置两者:
[Environment]::SetEnvironmentVariable("X", "Y", "Machine")
[Environment]::SetEnvironmentVariable("X", "Y", "Process")
你必须这样做,因为进程在启动时获取环境变量,而不是在 运行 期间(即你必须重新启动 shell 才能按你的方式工作):
[Environment]::SetEnvironmentVariable("X", "Y", "Machine")
$Env:X = "Y"
还有一种方法可以使用 WM_SETTINGCHANGE
将其广播给其他 windowsTo effect a change in the environment variables for the system or the user, broadcast this message with lParam set to the string "Environment".)
# Notify system of change via WM_SETTINGCHANGE
if (! ("Win32.NativeMethods" -as [Type]))
{
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
[Win32.Nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE, [UIntPtr]::Zero, "Environment", 2, 5000, [ref] $result) | out-null
}