无法使用SetEnvironmentVariable设置PATH

问题描述 投票:0回答:1

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

这里是我的代码段。它设置了系统环境变量(系统属性>环境变量>路径),但是,我无法在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”不起作用。我在这里想念什么吗?

powershell rabbitmq erlang
1个回答
0
投票
$env:PATH = ...

等效于(隐含名称空间前缀System.:]

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

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

也就是说,在两种情况下,您仅当前进程]更新环境变量-以后的会话将不是看到更新的值。

相反,如果将[Environment]::SetEnvironmentVariable()[Environment]::SetEnvironmentVariable() / [EnvironmentVariableTarget]::Machine目标一起使用,则更新persistent

定义在整个计算机范围内/仅针对当前用户,< [不更新当前过程中的值;也就是说,这些定义仅在future个会话中生效。不幸的是,没有

single调用会允许您执行both

,因此您将需要two调用:
[EnvironmentVariableTarget]::User
© www.soinside.com 2019 - 2024. All rights reserved.