本來(lái)想把這篇的內(nèi)容包括在我的Powershell系列文章之內(nèi)的,后來(lái)寫(xiě)完之后才想起來(lái)聂抢,這時(shí)候我已經(jīng)復(fù)制粘貼到簡(jiǎn)書(shū)冯凹、CSDN和SegmentFault三個(gè)地方了龟劲。所以這一篇干脆單獨(dú)寫(xiě)成一篇文章观话。
其實(shí)這篇文章的動(dòng)機(jī)也很簡(jiǎn)單予借,每個(gè)初學(xué)Java的人,都會(huì)被配置環(huán)境變量所難倒频蛔。尤其是對(duì)于那些不太懂電腦的人來(lái)說(shuō)灵迫,配置環(huán)境變量簡(jiǎn)直要命了。就算我這種配置了幾十次環(huán)境變量的人晦溪,也經(jīng)常忘了怎么配置瀑粥,每次配置也得現(xiàn)查。最蛋疼的是三圆,JDK的Windows平臺(tái)安裝包居然沒(méi)有配置環(huán)境變量的功能狞换,那么這個(gè)安裝包到底有何用處?
好了舟肉,廢話(huà)不多說(shuō)了修噪。由于這里只打算編寫(xiě)一個(gè)簡(jiǎn)單的腳本,所以首先讓我們規(guī)定一下這個(gè)腳本的用途度气。我的想法很簡(jiǎn)單割按,這個(gè)腳本應(yīng)該在JDK安裝程序執(zhí)行完畢調(diào)用膨报,從注冊(cè)表獲取JDK的安裝位置磷籍,然后自動(dòng)完成環(huán)境變量的配置。至于安裝位置是否存在现柠,安裝文件是否缺失院领,這都屬于用戶(hù)的問(wèn)題,不是我這個(gè)腳本的解決范圍够吩。
獲取JDK位置
在Windows注冊(cè)表中保存著所有安裝程序的信息比然,它們都在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
鍵下。
然后我們尋找JDK的信息周循。這里我從我電腦的安裝的JDK 8中截取了前一部分SE Development Kit
作為查詢(xún)字符串强法,不保證JDK 6和JDK 7的前一部分也和這一樣万俗。
$softwares = Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*
$jdk = $softwares | Where-Object DisplayName -Match 'Java SE Development Kit'
考慮到有的人電腦上安裝了不止一個(gè)JDK,我這里還做了多個(gè)JDK的處理工作饮怯。不過(guò)由于我電腦上只有一個(gè)JDK闰歪,所以這一部分我沒(méi)有測(cè)試,不保證一定可以工作蓖墅。
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('\')
添加環(huán)境變量
下面參考鏈接中介紹了新建環(huán)境變量的方法教翩。如果需要?jiǎng)?chuàng)建一個(gè)臨時(shí)環(huán)境變量吗冤,也就是只在當(dāng)前Powershell窗口中有效的罢杉,只需要一句話(huà)就可以搞定。
$env:TestVariable = "This is a test environment variable."
如果需要?jiǎng)?chuàng)建用戶(hù)或者系統(tǒng)級(jí)別的環(huán)境變量给郊,需要調(diào)用.NET框架的方法闰靴。這個(gè)方法有三個(gè)參數(shù)路捧,第一個(gè)指定環(huán)境變量名稱(chēng),第二個(gè)指定環(huán)境變量的值传黄,第三個(gè)指定環(huán)境變量類(lèi)型(Process
是僅當(dāng)前進(jìn)程有效杰扫,User
是用戶(hù)級(jí)別,Machine
是系統(tǒng)環(huán)境變量且需要管理員權(quán)限)膘掰。
[Environment]::SetEnvironmentVariable("TestVariable", "Test value.", "Machine")
然后我們根據(jù)JDK安裝位置設(shè)置環(huán)境變量章姓。
$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")
最后,打開(kāi)一個(gè)新的CMD或者是Powershell窗口识埋,輸入一下兩條命令測(cè)試環(huán)境變量是否配置正確凡伊。需要注意JDK安裝包好像會(huì)寫(xiě)一個(gè)java.exe
鏈接到可執(zhí)行路徑下,所以java
和javac
兩條命令都需要測(cè)試才能確保環(huán)境變量配置成功窒舟。
java -version
javac -version
完整腳本
下面是完整的腳本系忙,它也放到了我的Github上面了,有興趣的同學(xué)可以看看惠豺。
# 設(shè)置Java SDK 環(huán)境變量
$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 "找到多個(gè)JDK安裝程序:"
$id = 1
foreach ($e in $jdk) {
Write-Host "${id}." $e.DisplayName
$id++
}
$choice = [int](Read-Host -Prompt "應(yīng)該使用哪個(gè)?")
$jdk = $jdk[$choice]
}
$install_location = $jdk.InstallLocation.trim('\')
# 去掉路徑最后的斜杠
Write-Host "發(fā)現(xiàn)安裝位置: ${install_location}"
# 配置環(huán)境變量
$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環(huán)境變量成功"
因?yàn)檫@篇文章寫(xiě)出了可能就不會(huì)再更新了银还,而Github上腳本還可能會(huì)繼續(xù)更新,所以我又寫(xiě)了個(gè)下載執(zhí)行Github上腳本的命令洁墙。
invoke-WebRequest https://raw.githubusercontent.com/techstay/powershell-study/master/scripts/set-jdk-env-variables.ps1|Select-Object -ExpandProperty content|Invoke-Expression
如果出現(xiàn)什么策略錯(cuò)誤蛹疯,可能是默認(rèn)情況Powershell禁止運(yùn)行遠(yuǎn)程腳本,允許就可以了热监。
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
這個(gè)腳本在我電腦上測(cè)試沒(méi)問(wèn)題捺弦,不過(guò)不一定能夠在所有系統(tǒng)上運(yùn)行。所以使用的時(shí)候請(qǐng)注意,同時(shí)歡迎反饋信息列吼。
參考資料
http://jingyan.baidu.com/article/925f8cb836b26ac0dde0569e.html