版權(quán)聲明:本文為博主Atany原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。博客地址:http://blog.csdn.net/yang8456211
目錄(?)[+]
我不太喜歡用Window打代碼,感覺到處都會被束縛,沒有Mac那么行云流水 - 0-
比如今天在Window上開發(fā)的時候,遇到了一個問題:
使用新版本的JDGUI時候,提示需要使用JDK7以上的版本,于是乎只能win+PauseBreak呼出控制面板,在高級系統(tǒng)里面去設(shè)置java_HOME的值為JDK7的路徑。
1234512345設(shè)置完就感覺很不遍歷,假如我有需求需要不斷修改Java的版本呢?例如eclipse需要JAVA6,但是JDGUI卻需要JAVA7(在Mac上只需要一個bash腳本,修改Java指向的軟鏈接即可),那在Windows上該怎么弄呢?
于是乎,便花了幾個小時順著這個方向,從零開始整一整Window上的腳本環(huán)境。
二、目的
從直接需求出發(fā),我想實現(xiàn)的是一個能夠修改Java環(huán)境變量的腳本。要實現(xiàn)這個需求,實際上需要完成下面幾點:
可以在cmd的任何目錄直接執(zhí)行指令接收參數(shù),動態(tài)的修改環(huán)境變量的值重啟cmd能立即生效最后達到的狀態(tài)便是,win+R呼出cmd
三、Just do it
按照思路一個問題一個問題的來:
1、可以在cmd任何目錄直接執(zhí)行指令
首先想到的便是通過環(huán)境變量實現(xiàn),在環(huán)境變量中添加一個值,使得在執(zhí)行指令的時候,系統(tǒng)能夠搜尋到該目錄里面的腳本。(其實就類似與linux和Unix中的PRofile文件)
添加一個BAT_HOME,指向一個具體的目錄,我們之后會把腳本放到該目錄。
然后在環(huán)境變量PATH中添加%BAT_HOME%
準備工作完成,我們在BAT_HOME 的文件夾里面的新建一個bat文件TestTT.bat進行測試。
TestTT.bat
@echo offtitle hello world:startecho helloworldpause呼出cmd,執(zhí)行TestTT
這樣便有了最初的實現(xiàn)了,方便我們在任何目錄位置執(zhí)行腳本。可以說這一步是非常重要的,因為我們有了自己的腳本體系了,以小見大,以后可以把腳本都放在這個目錄,來實現(xiàn)各種各樣的功能了。
2、接收參數(shù),動態(tài)的修改環(huán)境變量的值
在這個實現(xiàn)上,經(jīng)過了些許思考,好不猶豫的選擇了Python~~哈哈!理由很簡單,bat語法不友好,python在邏輯上更容易修改(當然語言只是工具,具體的實現(xiàn)用自己喜歡就行)
我是用bat腳本調(diào)用python腳本實現(xiàn)邏輯控制,在具體修改環(huán)境變量的時候,再使用os.system調(diào)用bat腳本實現(xiàn)環(huán)境變量的修改。(這些bat腳本我都放在了BAT_HOME中)
changePath.bat : 簡單的調(diào)用python腳本
@echo offpython F:/PythonProj/pathChange/pathChange.py %1 %21212python腳本
# -*- coding: utf-8 -*-# @auth atanyyang# @blog http://blog.csdn.net/yang8456211 import osimport sys# 這里路徑要加一層引號,否則會被截斷JAVA_HOME_6 = '"C:/Program Files (x86)/Java/jdk1.6.0_13"'JAVA_HOME_7 = '"C:/Program Files/Java/jdk1.7.0_80"'PYTHON_HOME_2 = '"D:/Program Files/Python23"'PYTHON_HOME_3 = '"D:/Program Files/Python35-32"'def delete(lan): if lan == 'java': _lan = 'JAVA_HOME' elif lan == 'python': _lan = 'PYTHON_HOME' elif lan == 'test': _lan = 'TEST_HOME' else: return os.system('deletepath %s' % _lan)def add(lan,ver): if lan == 'java': _lan = 'JAVA_HOME' if ver == "6": _ver = JAVA_HOME_6 elif ver == "7": _ver = JAVA_HOME_7 elif lan == 'python': _lan = 'PYTHON_HOME' if ver == "2": _ver = PYTHON_HOME_2 elif ver == "3": _ver = PYTHON_HOME_3 else: return elif lan == 'test': _lan = 'TEST_HOME' _ver = "addnew1" else: return #print ("=========>" , _lan ,"--",_ver) os.system('addpath %s %s' % (_lan,_ver))def main(): # 檢查輸入 if (len(sys.argv) != 3): print("argv is error, len is " + len(sys.argv)) sys.exit(2) lan = sys.argv[1] version = sys.argv[2] if lan not in ['java','python','test']: print ("lan is wrong, plz check"); sys.exit(3) if (lan == 'java' and version not in ['6','7']) or (lan == 'python' and version not in ['2','3']): print ("version is wrong, plz check"); sys.exit(4) # 先刪除 delete(lan) # 再添加 add(lan,version)if __name__ == '__main__': main()123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081這里有一個問題需要注意,耽誤了我很大部分的時間,就是在使用os.system調(diào)用bat腳本的時候,
os.system('addpath %s %s' % (_lan,_ver))
,這里傳入的_ver路徑如果存在空格會被截斷!導(dǎo)致環(huán)境變量會被修改成C:/Program,而不是正確的路徑值。經(jīng)過研究,處理方法有兩種:
(第一種是在有空格的路徑雙引號外,再加多一層單引號)
例如:
JAVA_HOME_6 = '"C:/Program Files (x86)/Java/jdk1.6.0_13"'11在JAVA_HOME_6 字符串外加多一層單引號,就能夠正常傳遞帶空格的字符串了~
(第二種是不要使用os.system方法,修改為subprocess.popen)
理論上我應(yīng)該少用os.system 而改為用subprocess.popen,但是因為subprocess是python2.4以后才有的Api,而我在修改Java環(huán)境變量的同時,也有修改python版本的需求,當python切到2.3版本的時候,subprocess便找不到了,因此在這里使用了第一種的方法。
參數(shù)已經(jīng)處理完畢,我們調(diào)用bat腳本,來實現(xiàn)環(huán)境變量的修改,這里為了簡單我選擇寫了兩個腳本一個addpath,一個deletepath,方便以后的復(fù)用,在這里我們我們先刪除環(huán)境變量,再添加環(huán)境變量。
deletepath
@echo offtitle deletepath:startecho begin deletepath %1set regpath=HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/session Manager/Environmentset evname=%1reg delete "%regpath%" /v "%evname%" /fecho end deletepath %11234567891012345678910addpath
@echo offtitle addpathecho begin addpath %1 %2set regpath=HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/Environmentset evname=%1set thepath=%2reg add "%regpath%" /v %evname% /d %thepath% /f:: 如果沒有這一句不會立即生效setx %1 %2 -m echo end addpath %1 %2123456789101112131412345678910111213143、重啟cmd能立即生效
最開始寫完腳本嘗試的時候,發(fā)現(xiàn)環(huán)境變量并不能立即生效,必須打開環(huán)境變量手動點擊一次確定才能生效,這里耗費了較多時間去Google這個問題。
最后發(fā)現(xiàn),在腳本里面應(yīng)該已經(jīng)看到,如果需要立即生效,需要使用
setx %1 %2 -m
,這個指令的意思其實就是修改環(huán)境變量中%1中的值為%2,使其立即生效。因此,bat層的腳本也可以通過setx直接實現(xiàn)修改Java的環(huán)境變量,只需要簡單的修改一下python和bat腳本,在此就不贅述了。
楊光(atany)原創(chuàng),轉(zhuǎn)載請注明博主與博文鏈接,未經(jīng)博主允許,禁止任何商業(yè)用途。 博文地址:http://blog.csdn.net/yang8456211/article/details/54914505 博客地址:http://blog.csdn.net/yang8456211 本文遵循“署名-非商業(yè)用途-保持一致”創(chuàng)作公用協(xié)議
新聞熱點
疑難解答
圖片精選