版权声明:本文为博主Atany原创文章,未经博主允许不得转载。博客地址:http://blog.csdn.net/yang8456211
目录(?)[+]
我不太喜欢用Window打代码,感觉到处都会被束缚,没有Mac那么行云流水 - 0-
比如今天在Window上开发的时候,遇到了一个问题:
使用新版本的JDGUI时候,提示需要使用JDK7以上的版本,于是乎只能win+PauseBreak呼出控制面板,在高级系统里面去设置java_HOME的值为JDK7的路径。
1234512345设置完就感觉很不遍历,假如我有需求需要不断修改Java的版本呢?例如eclipse需要JAVA6,但是JDGUI却需要JAVA7(在Mac上只需要一个bash脚本,修改Java指向的软链接即可),那在Windows上该怎么弄呢?
于是乎,便花了几个小时顺着这个方向,从零开始整一整Window上的脚本环境。
二、目的
从直接需求出发,我想实现的是一个能够修改Java环境变量的脚本。要实现这个需求,实际上需要完成下面几点:
可以在cmd的任何目录直接执行指令接收参数,动态的修改环境变量的值重启cmd能立即生效最后达到的状态便是,win+R呼出cmd
三、Just do it
按照思路一个问题一个问题的来:
1、可以在cmd任何目录直接执行指令
首先想到的便是通过环境变量实现,在环境变量中添加一个值,使得在执行指令的时候,系统能够搜寻到该目录里面的脚本。(其实就类似与linux和Unix中的PRofile文件)
添加一个BAT_HOME,指向一个具体的目录,我们之后会把脚本放到该目录。
然后在环境变量PATH中添加%BAT_HOME%
准备工作完成,我们在BAT_HOME 的文件夹里面的新建一个bat文件TestTT.bat进行测试。
TestTT.bat
@echo offtitle hello world:startecho helloworldpause呼出cmd,执行TestTT
这样便有了最初的实现了,方便我们在任何目录位置执行脚本。可以说这一步是非常重要的,因为我们有了自己的脚本体系了,以小见大,以后可以把脚本都放在这个目录,来实现各种各样的功能了。
2、接收参数,动态的修改环境变量的值
在这个实现上,经过了些许思考,好不犹豫的选择了Python~~哈哈!理由很简单,bat语法不友好,python在逻辑上更容易修改(当然语言只是工具,具体的实现用自己喜欢就行)
我是用bat脚本调用python脚本实现逻辑控制,在具体修改环境变量的时候,再使用os.system调用bat脚本实现环境变量的修改。(这些bat脚本我都放在了BAT_HOME中)
changePath.bat : 简单的调用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调用bat脚本的时候,
os.system('addpath %s %s' % (_lan,_ver))
,这里传入的_ver路径如果存在空格会被截断!导致环境变量会被修改成C:/Program,而不是正确的路径值。经过研究,处理方法有两种:
(第一种是在有空格的路径双引号外,再加多一层单引号)
例如:
JAVA_HOME_6 = '"C:/Program Files (x86)/Java/jdk1.6.0_13"'11在JAVA_HOME_6 字符串外加多一层单引号,就能够正常传递带空格的字符串了~
(第二种是不要使用os.system方法,修改为subprocess.popen)
理论上我应该少用os.system 而改为用subprocess.popen,但是因为subprocess是python2.4以后才有的Api,而我在修改Java环境变量的同时,也有修改python版本的需求,当python切到2.3版本的时候,subprocess便找不到了,因此在这里使用了第一种的方法。
参数已经处理完毕,我们调用bat脚本,来实现环境变量的修改,这里为了简单我选择写了两个脚本一个addpath,一个deletepath,方便以后的复用,在这里我们我们先删除环境变量,再添加环境变量。
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能立即生效
最开始写完脚本尝试的时候,发现环境变量并不能立即生效,必须打开环境变量手动点击一次确定才能生效,这里耗费了较多时间去Google这个问题。
最后发现,在脚本里面应该已经看到,如果需要立即生效,需要使用
setx %1 %2 -m
,这个指令的意思其实就是修改环境变量中%1中的值为%2,使其立即生效。因此,bat层的脚本也可以通过setx直接实现修改Java的环境变量,只需要简单的修改一下python和bat脚本,在此就不赘述了。
杨光(atany)原创,转载请注明博主与博文链接,未经博主允许,禁止任何商业用途。 博文地址:http://blog.csdn.net/yang8456211/article/details/54914505 博客地址:http://blog.csdn.net/yang8456211 本文遵循“署名-非商业用途-保持一致”创作公用协议
新闻热点
疑难解答