我正在创建一个PowerShell脚本来帮助我在Windows上设置最新版本的Java和JavaFX。步骤如下:
- 从jkd.java.net和gluonhq.com确定Java和JavaFX的最新版本
- 分别从在线资源下载档案
- 将归档文件提取到系统 上的指定位置<<li>删除档案/gh>
- 使用JAVA_HOME和PATH_TO_FX更新用户环境变量
- 附加用户环境变量PATH %JAVA_HOME%bin
步骤1-5都按预期工作,但是步骤6会引起一些头痛。步骤6的代码如下所示,位于脚本的最后:
$p = [Environment]::GetEnvironmentVariable("PATH", [EnvironmentVariableTarget]::User)
$p = $p.Split(";", [System.StringSplitOptions]::RemoveEmptyEntries)
$p += "%JAVA_HOME%bin"
$p = ($p -join ";") + ";"
<# [Environment]::SetEnvironmentVariable("PATH", $p, [EnvironmentVariableTarget]::User) #>
<# Set-ItemProperty HKCU:Environment -Name "PATH" -Value $p -Type ExpandString #>
setx PATH "$p"
最初我使用了第一个注释代码SetEnvironmentVariable。通过研究,我确定这将注册表值设置为REG_SZ类型。(默认)。这不起作用,因为它需要一个类型REG_EXPAND_SZ对于任何使用%%替换的。第二个注释代码Set-ItemProperty确实提供了适当的类型,但是当我执行(dir env:PATH)时。值(在启动一个新的PowerShell实例以确保我有合适的环境之后)PATH根本不显示追加/展开的%JAVA_HOME%bin。但是,检查注册表并使用控制面板>系统属性我可以看到%JAVA_HOME%bin同时显示。那么发生了什么呢?
当我使用setx时,代码才工作命令。我对这种工作方式没有问题,但是难道没有更多的PowerShell"最佳实践"吗?如何达到同样的结果?我发现这个问题似乎正是我所做的,它似乎有效。它是操作问题的顺序(因为他们使用Set-ItemProperty,然后是setenenvironmentvariable)?
没关系,代码使用Set-ItemProperty工作。退出PowerShell并启动一个新的PowerShell实例不会像@Eryk Sun的评论所暗示的那样导致环境重新加载。必须完全注销用户(强制登录)或重新启动计算机才能展开%JAVA_HOME%。