做一個(gè)自動(dòng)配置JDK環(huán)境變量的Powershell腳本

本來(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í)行路徑下,所以javajavac兩條命令都需要測(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

https://technet.microsoft.com/en-us/library/ff730964.aspx

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末幽崩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子寞钥,更是在濱河造成了極大的恐慌歉铝,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凑耻,死亡現(xiàn)場(chǎng)離奇詭異太示,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)香浩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)类缤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人邻吭,你說(shuō)我怎么就攤上這事餐弱。” “怎么了囱晴?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵膏蚓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我畸写,道長(zhǎng)驮瞧,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任枯芬,我火速辦了婚禮论笔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘千所。我一直安慰自己狂魔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布淫痰。 她就那樣靜靜地躺著最楷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪待错。 梳的紋絲不亂的頭發(fā)上籽孙,一...
    開(kāi)封第一講書(shū)人閱讀 52,184評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音朗鸠,去河邊找鬼蚯撩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛烛占,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼忆家,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼犹菇!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起芽卿,我...
    開(kāi)封第一講書(shū)人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤揭芍,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后卸例,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體称杨,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年筷转,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了姑原。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呜舒,死狀恐怖锭汛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情袭蝗,我是刑警寧澤唤殴,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站到腥,受9級(jí)特大地震影響朵逝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乡范,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一廉侧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧篓足,春花似錦段誊、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至涩哟,卻和暖如春索赏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贴彼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工潜腻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人器仗。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓融涣,卻偏偏與公主長(zhǎng)得像童番,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子威鹿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理剃斧,服務(wù)發(fā)現(xiàn),斷路器忽你,智...
    卡卡羅2017閱讀 134,695評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,844評(píng)論 6 342
  • 教程存檔Github 序|Preface 先來(lái)一篇有趣的簡(jiǎn)介:Emacs和Vim:神的編輯器和編輯器之神 - 51...
    北魏企鵝閱讀 138,008評(píng)論 18 224
  • 文章摘要一科雳、Java開(kāi)發(fā)環(huán)境的配置1根蟹、Ubuntu下環(huán)境變量的安裝與配置。2糟秘、Windows環(huán)境變量的配置简逮。二、U...
    Android那些事兒閱讀 1,910評(píng)論 0 49
  • 是否存在,沒(méi)有質(zhì)量的生命呢吼畏,應(yīng)該是不存在的吧督赤。 活著即價(jià)值。 這句話(huà)雖然我寫(xiě)在前面泻蚊,并不代表我深信不疑躲舌。 活著即希...
    王七歲閱讀 137評(píng)論 0 0