本來想把這篇的内容包括在我的Powershell系列文章之内的,後來寫完之後才想起來,這時候我已經複制粘貼到簡書、CSDN和SegmentFault三個地方了。是以這一篇幹脆單獨寫成一篇文章。
其實這篇文章的動機也很簡單,每個初學Java的人,都會被配置環境變量所難倒。尤其是對于那些不太懂電腦的人來說,配置環境變量簡直要命了。就算我這種配置了幾十次環境變量的人,也經常忘了怎麼配置,每次配置也得現查。最蛋疼的是,JDK的Windows平台安裝包居然沒有配置環境變量的功能,那麼這個安裝包到底有何用處?
好了,廢話不多說了。由于這裡隻打算編寫一個簡單的腳本,是以首先讓我們規定一下這個腳本的用途。我的想法很簡單,這個腳本應該在JDK安裝程式執行完畢調用,從系統資料庫擷取JDK的安裝位置,然後自動完成環境變量的配置。至于安裝位置是否存在,安裝檔案是否缺失,這都屬于使用者的問題,不是我這個腳本的解決範圍。
擷取JDK位置
在Windows系統資料庫中儲存着所有安裝程式的資訊,它們都在
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
鍵下。
然後我們尋找JDK的資訊。這裡我從我電腦的安裝的JDK 8中截取了前一部分
SE Development Kit
作為查詢字元串,不保證JDK 6和JDK 7的前一部分也和這一樣。
$softwares = Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*
$jdk = $softwares | Where-Object DisplayName -Match 'Java SE Development Kit'
考慮到有的人電腦上安裝了不止一個JDK,我這裡還做了多個JDK的處理工作。不過由于我電腦上隻有一個JDK,是以這一部分我沒有測試,不保證一定可以工作。
if ($jdk.Count -gt 1) {
Write-Host "Found more than one jdks :"
$id = 1
foreach ($e in $jdk) {
Write-Host "${id}." $e.DisplayName
$id++
}
$choice = [int](Read-Host -Prompt "which to use ?")
$jdk = $jdk[$choice]
}
擷取到JDK資訊之後,讀取它的安裝位置屬性,即可擷取到JDK的安裝位置。
$install_location = $jdk.InstallLocation
# 去掉路徑最後的斜杠
Write-Host "Found installation Location : ${install_location}".trim('\')
添加環境變量
下面參考連結中介紹了建立環境變量的方法。如果需要建立一個臨時環境變量,也就是隻在目前Powershell視窗中有效的,隻需要一句話就可以搞定。
$env:TestVariable = "This is a test environment variable."
如果需要建立使用者或者系統級别的環境變量,需要調用.NET架構的方法。這個方法有三個參數,第一個指定環境變量名稱,第二個指定環境變量的值,第三個指定環境變量類型(
Process
是僅目前程序有效,
User
是使用者級别,
Machine
是系統環境變量且需要管理者權限)。
[Environment]::SetEnvironmentVariable("TestVariable", "Test value.", "Machine")
然後我們根據JDK安裝位置設定環境變量。
$java_home = $install_location
$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")
最後,打開一個新的CMD或者是Powershell視窗,輸入一下兩條指令測試環境變量是否配置正确。需要注意JDK安裝包好像會寫一個
java.exe
連結到可執行路徑下,是以
java
和
javac
兩條指令都需要測試才能確定環境變量配置成功。
java -version
javac -version
完整腳本
下面是完整的腳本,它也放到了
我的Github上面了,有興趣的同學可以看看。
# 設定Java SDK 環境變量
$softwares = Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*
$jdk = $softwares | Where-Object DisplayName -Match 'Java SE Development Kit'
if ($jdk.Count -gt 1) {
Write-Host "找到多個JDK安裝程式:"
$id = 1
foreach ($e in $jdk) {
Write-Host "${id}." $e.DisplayName
$id++
}
$choice = [int](Read-Host -Prompt "應該使用哪個?")
$jdk = $jdk[$choice]
}
$install_location = $jdk.InstallLocation.trim('\')
# 去掉路徑最後的斜杠
Write-Host "發現安裝位置: ${install_location}"
# 配置環境變量
$java_home = $install_location
$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")
Write-Host "配置JDK環境變量成功"
因為這篇文章寫出了可能就不會再更新了,而Github上腳本還可能會繼續更新,是以我又寫了個下載下傳執行Github上腳本的指令。
invoke-WebRequest https://raw.githubusercontent.com/techstay/powershell-study/master/scripts/set-jdk-env-variables.ps1|Select-Object -ExpandProperty content|Invoke-Expression
如果出現什麼政策錯誤,可能是預設情況Powershell禁止運作遠端腳本,允許就可以了。
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
這個腳本在我電腦上測試沒問題,不過不一定能夠在所有系統上運作。是以使用的時候請注意,同時歡迎回報資訊。