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

15

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

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

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

Environment Variable

然后从 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”变量,以便路径在一个位置。
3个回答

17

我从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 应该已经加载完成。就这样!


我必须添加 $($env:JAVA_HOME)\bin 才能正常工作,因为优先级的原因,我需要修改 PATH 中的顺序。我将其放在开头而不是结尾进行添加。谢谢! - davidmpaz

11

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

$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系统路径用户路径 的合并。根据执行此命令的用户,生成的 路径 将包含不同的条目(包括用户个人配置文件和原始系统文件)。如果你真的只想更改系统路径,应该使用:

$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”环境变量中。实际上,我想从powershell添加动态路径,通过添加%JAVA_HOME%(就像我们可以从环境变量窗口中做的那样),所以如果有一天JAVA_HOME的路径更改,它将反映在使用%JAVA_HOME%(例如Path)的其他人中。这可能吗? - muhihsan
太奇怪了,环境变量可以通过$env:Path访问,而 PowerShell 的所有命令都是以<动词>-<对象>的形式使用的。 - undefined

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接