在Powershell中设置后,计算机级环境变量不可用

在Powershell中设置后,计算机级环境变量不可用,powershell,environment-variables,powershell-4.0,Powershell,Environment Variables,Powershell 4.0,以下代码未按预期返回“Y”。只有在下一个会话(另一个新窗口)中它才能工作?我希望它能马上上市 [Environment]::SetEnvironmentVariable("X", "Y", "Machine") Write-Host $env:X 据我所知,一个进程只加载一次环境变量(在开始时)。但您可以使用以下方法进行更改: [Environment]::SetEnvironmentVariable("X", "Y", "Process") # for the current

以下代码未按预期返回“Y”。只有在下一个会话(另一个新窗口)中它才能工作?我希望它能马上上市

    [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才能按自己的方式工作):

还有一种方法可以使用

更改系统或系统的环境变量的步骤 用户,在lParam设置为字符串的情况下广播此消息 “环境”。)

 [Environment]::SetEnvironmentVariable("X", "Y", "Machine")
 $Env:X = "Y"
# 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
}