我正在尝试在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'不起作用呢?我是否遗漏了什么?
1条答案
按热度按时间6ioyuze21#
相等(隐含命名空间前置词
System.
):PowerShell自动将字符串转换为枚举值,因此
'Process'
代替[EnvironmentVariableTarget]::Process
也可以工作。也就是说,在这两种情况下,您仅更新 * 当前进程的环境变量*-将来的会话将 * 不会 * 看到更新后的值。
相比之下,如果将
[Environment]::SetEnvironmentVariable()
与**[EnvironmentVariableTarget]::Machine
/[EnvironmentVariableTarget]::User
目标一起使用,则仅为当前用户更新 * 持久性 * 定义计算机范围/,* 而不同时更新当前进程中的值 *;也就是说,这些定义仅在 * 未来 * 会话中生效。**不幸的是,没有一个 * 单一 * 调用可以让您 * 同时 * 执行,因此您需要 * 两个 * 调用:
注意事项:
$env:PATH
值是一个 * 复合 * 值,它是基于注册表的 * 计算机 * 级定义和 * 用户 * 级定义的串联。$env:PATH
仅包含 * 扩展 * 文本值-即使底层注册表项可以通过合并对 * 其他 * 环境变量的引用来定义(例如%SystemRoot%
)-[Environment]::SetEnvironmentVariable()
仅支持写入 * 文本 * 路径。因此,正确的解决方案需要从注册表中阅读和写入原始(未解析)定义,如this answer所示。