无法使用 SetEnvironmentVariable 设置 PATH

Unable to set PATH using SetEnvironmentVariable

我正在尝试在我的 powershell 脚本中设置环境变量。

我的代码 snippet.It 设置了系统环境变量(系统属性 > 环境变量 > 路径)但是,我无法在 powershell 中启动 rabbitmq-service。

'$ENV:PATH' 命令输出没有新添加的路径。系统重新启动后 $ENV:PATH 包含新路径但命令 'rabbitmq-service' 仍然不起作用。

  # SET Erlang and RabbitMQ  Home Path
    $ERLANG_HOME = "$env:PROGRAMFILES\erl9.2"
    [System.Environment]::SetEnvironmentVariable("ERLANG_HOME", $ERLANG_HOME, "Machine")

    $ERTS_HOME = "$env:PROGRAMFILES\erts-9.2"
    [System.Environment]::SetEnvironmentVariable("ERTS_HOME", $ERTS_HOME, "Machine")

    $RABBITMQ_HOME = "$env:PROGRAMFILES\RabbitMQ Server\rabbitmq_server-3.6.11" 
    [System.Environment]::SetEnvironmentVariable("RABBITMQ_HOME", $RABBITMQ_HOME, "Machine")


    # Add Erlang and RabbitMQ to Path     
    $System_Path_Elems = [System.Environment]::GetEnvironmentVariable("PATH", "Machine").Split(";")
    if (!$System_Path_Elems.Contains("$RABBITMQ_HOME\sbin") -and !$System_Path_Elems.Contains("$ERLANG_HOME\bin") -and !$System_Path_Elems.Contains("$ERTS_HOME\bin"))
    {       
    $newPath = [System.String]::Join(";", $System_Path_Elems + "$ERLANG_HOME\bin" + "$ERTS_HOME\bin" + "$RABBITMQ_HOME\sbin")
    [System.Environment]::SetEnvironmentVariable("PATH", $newPath, "Machine")   
    }

如果我在我的脚本中使用 $env:PATH 设置 PATH,它就可以工作。

$env:Path += ";C:\Program Files\erl9.2\erts-9.2\bin;
C:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.11\sbin;C:\Program Files\erl9.2\bin"  

我能够毫无问题地执行以下命令。

rabbitmq-service remove
rabbitmq-plugins enable rabbitmq_management --offline
rabbitmq-service install
rabbitmq-service start

所以,为什么 'SetEnvironmentVariable' 不起作用。我在这里遗漏了什么吗?

$env:PATH = ...

等同于(隐含命名空间前缀 System.):

[Environment]::SetEnvironmentVariable(
  'PATH', 
   ..., 
   [EnvironmentVariableTarget]::Process
)

PowerShell 自动将字符串转换为枚举值,因此 'Process' 代替 [EnvironmentVariableTarget]::Process 也可以。

也就是说,在这两种情况下,您都只为当前进程更新环境变量 - 未来的会话将没有看到更新后的值。

相比之下,如果将 [Environment]::SetEnvironmentVariable()[EnvironmentVariableTarget]::Machine / [EnvironmentVariableTarget]::User 目标一起使用,则 更新 持久性 定义 机器范围/仅针对当前用户,不更新当前进程中的值;也就是说,这些定义 仅在 未来 会话中生效。

遗憾的是,没有 单个 调用可让您执行 两者,因此您需要 两次次通话:

# Update the current process' env.var
$env.PATH = ... 
# Also persist the new value.
# Note that targeting [EnvironmentVariableTarget]::Machine requires
# ELEVATION (running as admin).
[Environment]::SetEnvironmentVariable('PATH', $env:PATH, <target>)