rabbitmq 无法使用SetEnvironmentVariable设置路径

elcex8rz  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(1)|浏览(145)

我正在尝试在powershell脚本中设置环境变量。
这是我的代码片段。它设置了系统环境变量(系统属性〉环境变量〉路径),但是,我无法在powershell中启动rabbitmq服务。
“$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'不起作用呢?我是否遗漏了什么?

6ioyuze2

6ioyuze21#

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

注意事项

  • 在Windows上,进程级$env:PATH值是一个 * 复合 * 值,它是基于注册表的 * 计算机 * 级定义和 * 用户 * 级定义的串联。
  • 此外,正如$env:PATH仅包含 * 扩展 * 文本值-即使底层注册表项可以通过合并对 * 其他 * 环境变量的引用来定义(例如%SystemRoot%)-[Environment]::SetEnvironmentVariable()仅支持写入 * 文本 * 路径。

因此,正确的解决方案需要从注册表中阅读和写入原始(未解析)定义,如this answer所示。

相关问题