问题

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

继承我的代码片段.它设置系统环境变量(System Properties> Environment variable> Path)但是,我无法在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
abbitmq_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_HOMEin") -and !$System_Path_Elems.Contains("$ERTS_HOMEin"))
    {       
    $newPath = [System.String]::Join(";", $System_Path_Elems + "$ERLANG_HOMEin" + "$ERTS_HOMEin" + "$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 目标,则只更新当前用户的持久定义 machine-value/,而不更新当前流程中的值;也就是说,这些定义只在未来会话中生效。

不幸的是,没有一个电话允许您两者都这样做,所以您需要两个电话:

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

  相同标签的其他问题

powershellrabbitmqerlang