## 准备
因为使用到了powershell脚本,而powershell默认是禁止运行脚本的,所以需要先配置一下。
以管理员权限打开powershell,运行以下命令,提示选项输入`Y`。
```powershell
Set-ExecutionPolicy RemoteSigned
```
## 运行
解除限制后,即可将以下代码保存进一个后缀名为`.ps1`的文本文件中,然后使用管理员权限运行
```powershell
# 获取文件夹路径
[string] $javaPath = Read-Host "请输入你的JDK文件夹路径`n例: C:\Program Files\Java\jdk1.8.0_211`n"
# 设置JAVA_HOME环境变量
setx "JAVA_HOME" $javaPath -M
# 获取原始环境变量, 带%的环境变量, 而不是已经变成完整路径的环境变量
[string] $_originPath = reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v "Path"
# 进行截取, 去除不需要的部分
$_path = $_originPath[-2]
# 貌似在不同版本的powershell上运行有区别, 有的结果带换行, 有的结果不带换行; 甚至在命令行直接运行和在脚本里运行拿出来的结果也不同
if($_path.GetType().Name -eq "Char" -or $_path.StartsWith(";")) { # 如果Type是Char, 那么就是就是不带换行的结果,这里会拿到一个分号(';')
Write-Output "go if"
$_path = $_originPath.Substring(110)
} else {
Write-Output "go else"
$_path = $_path.Trim().Substring(25)
}
# 添加到Path,并获取执行结果
[string] $rs = setx -m PATH "$_path;%JAVA_HOME%\bin;%JAVA_HOME%\include;%JAVA_HOME%\jre;%JAVA_HOME%\lib;"
# 如果没有返回结果,大概率是没有用管理员权限运行
if ([String]::IsNullOrEmpty($rs)) {
Write-Output "请确保你使用的是管理员权限运行"
} else {
if ($rs.StartsWith("成功")) {
Write-Output "添加的环境变量需要重启才能生效`n请在保存完数据后再重启"
}
}
Pause
```
## 为什么是Powershell
这个脚本最初的版本是cmd的,但是发现%path%在cmd中,像%JAVA_HOME%\bin这种相对路径,会变成绝对路径,在cmd中不知道该如何接收reg query查询的结果,而Powershell可以直接用 '=' 等号来接收结果,自然就改用Powershell了。
[记录,学习] 半自动配置Java环境(JAVA_HOME)