gpt4 book ai didi

powershell - 无法使用SetEnvironmentVariable设置PATH

转载 作者:行者123 更新时间:2023-12-03 00:59:43 24 4
gpt4 key购买 nike

我试图在我的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”不起作用。我在这里想念什么吗?

最佳答案

$env:PATH = ...

等效于(隐含 namespace 前缀 System.):

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

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

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

相比之下,如果您将 [Environment]::SetEnvironmentVariable() [EnvironmentVariableTarget]::Machine / [EnvironmentVariableTarget]::User 目标一起使用,则 仅在当前用户范围内更新持久性定义机器范围/的定义,而无需在当前过程中也更新值;也就是说,这些定义 仅在以后的 session 中生效。

不幸的是,没有一个电话可以让您同时执行这两个操作,因此您将需要两个电话:
# 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>)

关于powershell - 无法使用SetEnvironmentVariable设置PATH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58210987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com