Bash玩转脚本5之Windows上修改环境变量的脚本系统

目录(?)[+]

一、前言


我不太喜欢用Window打代码,感觉到处都会被束缚,没有Mac那么行云流水 - 0-

比如今天在Window上开发的时候,遇到了一个问题:

使用新版本的JDGUI时候,提示需要使用JDK7以上的版本,于是乎只能win+PauseBreak呼出控制面板,在高级系统里面去设置JAVA_HOME的值为JDK7的路径。

设置完就感觉很不遍历,假如我有需求需要不断修改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 off
title hello world
:start
echo helloworld
pause
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

呼出cmd,执行TestTT 
这里写图片描述

这样便有了最初的实现了,方便我们在任何目录位置执行脚本。可以说这一步是非常重要的,因为我们有了自己的脚本体系了,以小见大,以后可以把脚本都放在这个目录,来实现各种各样的功能了。

2、接收参数,动态的修改环境变量的值

在这个实现上,经过了些许思考,好不犹豫的选择了Python~~哈哈!理由很简单,bat语法不友好,python在逻辑上更容易修改(当然语言只是工具,具体的实现用自己喜欢就行)

我是用bat脚本调用python脚本实现逻辑控制,在具体修改环境变量的时候,再使用os.system调用bat脚本实现环境变量的修改。(这些bat脚本我都放在了BAT_HOME中)

changePath.bat : 简单的调用python脚本

@echo off
python F:\PythonProj\pathChange\pathChange.py %1 %2
   
   
  • 1
  • 2
  • 1
  • 2

python脚本

# -*- coding: utf-8 -*-
# @auth atanyyang
# @blog http://blog.csdn.net/yang8456211 

import os
import 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()
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81

这里有一个问题需要注意,耽误了我很大部分的时间,就是在使用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"'
   
   
  • 1
  • 1

在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 off
title deletepath
:start
echo begin deletepath %1

set regpath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
set evname=%1
reg delete "%regpath%" /v "%evname%"  /f

echo end deletepath %1
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

addpath

@echo off
title addpath

echo begin addpath %1 %2

set regpath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
set evname=%1
set thepath=%2
reg add "%regpath%" /v %evname% /d %thepath% /f

:: 如果没有这一句不会立即生效
setx %1 %2 -m 

echo end addpath %1 %2
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

3、重启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 
本文遵循“署名-非商业用途-保持一致”创作公用协议

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值