我在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
仍然没有运行。路径是正确的,注册表中的路径也是正确的。
我确信路径是正确的,因为当我修改" Path" (通过MyPC / RigthClick / Properties / Advaced / EnvironmentVariables /等步骤删除','在#34;路径"的头部)。我还尝试配置" Path"没有";"在头脑中,仍然无法成功运行java
,修改"路径"通过添加";",它运行良好。
答案 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中描述了这种行为。