正确配置JDK环境变量后仍未找到Java命令

时间:2017-08-10 07:34:03

标签: java windows powershell environment-variables

我在Windows虚拟机启动时安装JDK,使用cloudinit用户数据将PowerShell脚本传输到Windows机器,然后运行脚本安装JDK。

$softwares = Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*
$jdk = $softwares | Where-Object DisplayName -match 'Java SE Development Kit'
$java_home = $jdk.InstallLocation.Trim('\')
#$java_home = "C:\Program Files\Java\jdk1.7.0_80"
$classpath = ".;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar"
$path = ";%JAVA_HOME%\bin;" + $env:Path
[Environment]::SetEnvironmentVariable("JAVA_HOME", $java_home, "machine")
[Environment]::SetEnvironmentVariable("CLASSPATH", $classpath, "machine")
[Environment]::SetEnvironmentVariable("PATH", $path , "machine")

问题是我的脚本成功安装了JDK并正确修改了环境变量,但命令java仍然没有运行。路径是正确的,注册表中的路径也是正确的。

I am sure the path is right

我确信路径是正确的,因为当我修改" Path" (通过MyPC / RigthClick / Properties / Advaced / EnvironmentVariables /等步骤删除','在#34;路径"的头部)。我还尝试配置" Path"没有";"在头脑中,仍然无法成功运行java,修改"路径"通过添加";",它运行良好。

1 个答案:

答案 0 :(得分:0)

环境变量存储在注册表中。 [Environment]::SetEnvironmentVariable()将给定变量写为REG_SZ值,但对于要展开的嵌套变量,您需要REG_EXPAND_SZ值。

如果您想在PATH中使用%JAVA_HOME%\bin,请使用Set-ItemProperty代替[Environment]::SetEnvironmentVariable()

$regkey = 'HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment'
Set-ItemProperty -Path $regkey -Name 'Path' -Value $path -Type ExpandString

请注意,在环境变量中使用嵌套变量时,由于它们的扩展顺序,可能存在其他缺陷。 Raymond Chen在文章Windows Confidential: The hidden variables中描述了这种行为。