原本想把這篇的內容包括在個人Powershell系列文章以內的,後來寫完以後纔想起來,這時候我已經複製粘貼到簡書、CSDN和SegmentFault三個地方了。因此這一篇乾脆單獨寫成一篇文章。html
其實這篇文章的動機也很簡單,每一個初學Java的人,都會被配置環境變量所難倒。尤爲是對於那些不太懂電腦的人來講,配置環境變量簡直要命了。就算我這種配置了幾十次環境變量的人,也常常忘了怎麼配置,每次配置也得現查。最蛋疼的是,JDK的Windows平臺安裝包竟然沒有配置環境變量的功能,那麼這個安裝包到底有何用處?java
好了,廢話很少說了。因爲這裏只打算編寫一個簡單的腳本,因此首先讓咱們規定一下這個腳本的用途。個人想法很簡單,這個腳本應該在JDK安裝程序執行完畢調用,從註冊表獲取JDK的安裝位置,而後自動完成環境變量的配置。至於安裝位置是否存在,安裝文件是否缺失,這都屬於用戶的問題,不是我這個腳本的解決範圍。git
在Windows註冊表中保存着全部安裝程序的信息,它們都在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
鍵下。github
而後咱們尋找JDK的信息。這裏我從我電腦的安裝的JDK 8中截取了前一部分SE Development Kit
做爲查詢字符串,不保證JDK 6和JDK 7的前一部分也和這同樣。shell
$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窗口中有效的,只須要一句話就能夠搞定。spa
$env:TestVariable = "This is a test environment variable."
若是須要建立用戶或者系統級別的環境變量,須要調用.NET框架的方法。這個方法有三個參數,第一個指定環境變量名稱,第二個指定環境變量的值,第三個指定環境變量類型(Process
是僅當前進程有效,User
是用戶級別,Machine
是系統環境變量且須要管理員權限)。code
[Environment]::SetEnvironmentVariable("TestVariable", "Test value.", "Machine")
而後咱們根據JDK安裝位置設置環境變量。htm
$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
這個腳本在我電腦上測試沒問題,不過不必定可以在全部系統上運行。因此使用的時候請注意,同時歡迎反饋信息。