通过 Powershell 将 JAVA_HOME 添加到系统变量 Path

Posted

技术标签:

【中文标题】通过 Powershell 将 JAVA_HOME 添加到系统变量 Path【英文标题】:Adding JAVA_HOME to system variable Path via Powershell 【发布时间】:2018-11-08 18:03:08 【问题描述】:

我正在尝试通过 Powershell 脚本将%JAVA_HOME%\bin 添加到Path 环境变量中。

JAVA_HOME 变量本身指向C:\Program Files\Java\jdk1.8.0_172

当我从环境变量窗口手动添加%JAVA_HOME%\bin

然后从Powershell中调用这行代码获取Path变量的值

[Environment]::GetEnvironmentVariable('Path', [System.EnvironmentVariableTarget]::Machine)

上面执行行的结果似乎将%JAVA_HOME%\bin 转换为我定义的实际路径C:\Program Files\Java\jdk1.8.0_172

输出如下所示

...;C:\Program Files\nodejs;C:\Program Files\Java\jdk1.8.0_172\bin;

但是当我使用下面的代码通过 Powershell 脚本添加 %JAVA_HOME%\bin

[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable('Path', [EnvironmentVariableTarget]::Machine) + "%JAVA_HOME%\bin", [EnvironmentVariableTarget]::Machine)

然后再次运行GetEnvironmentVariable函数,输出与我通过环境变量窗口添加路径时不同。它不会将%JAVA_HOME%\bin 转换为实际路径。

输出如下所示

....;C:\Program Files\nodejs\;C:\Program Files\Java\jdk1.8.0_172\bin;%JAVA_HOME%\bin

这是预期的吗?还是我遗漏了什么?

我实际上可以直接将真实路径附加到Path 变量,但我想使用JAVA_HOME 变量,因此路径将位于1 个位置。

【问题讨论】:

【参考方案1】:

首先,您可以使用以下语法在 PowerShell 中访问 then environememnt 变量:

$env:Path

所以在你的情况下你可以写:

[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable('Path', [EnvironmentVariableTarget]::Machine) + "$($Env:JAVA_HOME)\bin", [EnvironmentVariableTarget]::Machine)

这是一个例子:

PS C:\> [Environment]::SetEnvironmentVariable("JAVA_HOME", "c:\temp")
PS C:\> $env:JAVA_HOME
c:\temp

PS C:\> [Environment]::SetEnvironmentVariable("TEST", "$($Env:JAVA_HOME);c\docs")

PS C:\> $env:TEST
c:\temp;c\docs

这就是你要找的吗?

# example of adding a path to PATH
[System.Environment]::SetEnvironmentVariable("PATH", $Env:Path + ";$($Env:JAVA_HOME)\bin", "User")

小心$Env:Path系统路径用户路径的合并。根据执行此命令的用户,生成的 Path 将包含不同的条目(用户配置文件和原始系统条目)。如果你真的想只改变你应该使用的系统:

$oldSysPath = (Get-Itemproperty -path 'hklm:\system\currentcontrolset\control\session manager\environment' -Name Path).Path
$newSysPath = $oldSysPath + ";$($Env:JAVA_HOME)\bin"

Set-ItemProperty -path 'hklm:\system\currentcontrolset\control\session manager\environment' -Name Path -Value $newSysPath 

【讨论】:

感谢您的回答,但这只会将路径直接添加到TEST 环境变量中。我实际上想通过添加%JAVA_HOME%从powershell添加一个动态路径(就像我们如何从环境变量窗口中那样)所以如果有一天JAVA_HOME的路径发生变化,它将反映在使用%JAVA_HOME%的其他人中(喜欢Path)。这可能吗?【参考方案2】:

在我从 oracle 网站安装 JAVA 后,我设置了

 [System.Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\Program Files\Java\jdk-13.0.1")

在我做的路径中设置java,

 [System.Environment]::SetEnvironmentVariable("Path", [System.Environment]::GetEnvironmentVariable('Path', [System.EnvironmentVariableTarget]::Machine) + ";$($env:JAVA_HOME)\bin")

工作就像一个魅力!

如果你想让它在你打开 powershell 时自动加载,你可以这样做,

New-Item $profile -Type File -Force

然后在记事本中打开

notepad.exe $profile

然后粘贴

 [System.Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\Program Files\Java\jdk-13.0.1")
 [System.Environment]::SetEnvironmentVariable("Path", [System.Environment]::GetEnvironmentVariable('Path', [System.EnvironmentVariableTarget]::Machine) + ";$($env:JAVA_HOME)\bin")

您现在可以关闭记事本了! 接下来,您要允许 powershell 运行 ps 脚本,所以不要忘记授予在加载时运行配置文件脚本的不受限制的访问权限,

 Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser

现在应该在重新打开 powershell 后加载 Java。就是这样!

【讨论】:

【参考方案3】:
# START POWERSHELL7
start-process "c:\Program Files\PowerShell\7\pwsh.exe" -verb runas
# ADD "JAVA_HOME"
[System.Environment]::SetEnvironmentVariable("JAVA_HOME", "c:\opt\jdk-15", [System.EnvironmentVariableTarget]::Machine)
[System.Environment]::GetEnvironmentVariable("JAVA_HOME", [System.EnvironmentVariableTarget]::Machine)
# ADD "bin += path"
[System.Environment]::SetEnvironmentVariable("Path", "%JAVA_HOME%\bin;" + [Environment]::GetEnvironmentVariable('Path', [EnvironmentVariableTarget]::Machine), [System.EnvironmentVariableTarget]::Machine)
[System.Environment]::GetEnvironmentVariable("Path", [System.EnvironmentVariableTarget]::Machine)

【讨论】:

以上是关于通过 Powershell 将 JAVA_HOME 添加到系统变量 Path的主要内容,如果未能解决你的问题,请参考以下文章

通过 bat 脚本将 deluge torrentname 传递给 powershell

通过管道将 CMD 输出传递给 Powershell [重复]

Powershell:将外部命令输出通过管道传输到另一个外部命令

通过 Powershell 脚本将权限角色分配给服务主体

如何通过powershell将用户权限分配给本地用户帐户?

通过命令行将变量传递给powershell脚本