【问题标题】:Machine level environment variable not available after setting in Powershell在 Powershell 中设置后机器级环境变量不可用
【发布时间】:2016-04-28 10:13:02
【问题描述】:

以下代码未按预期返回“Y”。仅在下一个会话(另一个新窗口)中有效?我希望它立即可用?

    [Environment]::SetEnvironmentVariable("X", "Y", "Machine")
    Write-Host $env:X

【问题讨论】:

    标签: powershell environment-variables powershell-4.0


    【解决方案1】:

    您必须这样做,因为该进程在启动时获取环境变量,而不是在运行时(即您必须重新启动 shell 才能按您的方式工作):

     [Environment]::SetEnvironmentVariable("X", "Y", "Machine")
     $Env:X = "Y"
    

    还有一种方法可以使用WM_SETTINGCHANGE 将其广播到其他窗口

    为了改变系统的环境变量或 用户,使用设置为字符串的 lParam 广播此消息 “环境”。)

    # 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
    }
    

    【讨论】:

      【解决方案2】:

      据我所知,一个进程只加载一次环境变量(在开始时)。但是您可以使用以下方法更改它:

      [Environment]::SetEnvironmentVariable("X", "Y", "Process") # for the current session
      

      注意:您可能想同时设置:

      [Environment]::SetEnvironmentVariable("X", "Y", "Machine")
      [Environment]::SetEnvironmentVariable("X", "Y", "Process")
      

      【讨论】:

        猜你喜欢
        • 2020-09-29
        • 1970-01-01
        • 2016-01-11
        • 2021-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-18
        • 1970-01-01
        相关资源
        最近更新 更多