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

时间:2018-05-30 01:45:28

标签: windows powershell environment-variables

我尝试通过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变量,但我想使用{{1}}变量,因此路径将位于1位置。

3 个答案:

答案 0 :(得分:4)

从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。就是这样!

答案 1 :(得分:1)

首先,您可以使用以下语法在PowerShell中访问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 

答案 2 :(得分:0)

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