search
尋找貓咪~QQ 地點 桃園市桃園區 Taoyuan , Taoyuan

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

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

呼出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

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"'defdelete(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) defadd(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: returnelif lan == 'test': _lan = 'TEST_HOME' _ver = "addnew1"else: return#print ("=========>" , _lan ,"--",_ver) os.system('addpath %s %s' % (_lan,_ver)) defmain:# 檢查輸入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 notin ['java''python''test']: print ("lan is wrong, plz check"); sys.exit(3) if (lan == 'java'and version notin ['6''7']) or (lan == 'python'and version notin ['2''3']): print ("version is wrong, plz check"); sys.exit(4) # 先刪除 delete(lan) # 再添加 add(lan,version) if __name__ == '__main__': main

這裡有一個問題需要

注意

,耽誤了我很大部分的時間,就是在使用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"'

在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 %1set regpath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment set evname=%1 reg delete"%regpath%" /v "%evname%" /f echo end deletepath %1

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

3、重啟cmd能立即生效

最開始寫完腳本嘗試的時候,發現環境變數並不能立即生效,必須打開環境變數手動點擊一次確定才能生效,這裡耗費了較多時間去Google這個問題。

最後發現,在腳本裡面應該已經看到,如果需要立即生效,需要使用

setx %1 %2 -m

,這個指令的意思其實就是修改環境變數中%1中的值為%2,使其立即生效。

因此,bat層的腳本也可以通過setx直接實現修改Java的環境變數,只需要簡單的修改一下python和bat腳本,在此就不贅述了。



熱門推薦

本文由 yidianzixun 提供 原文連結

寵物協尋 相信 終究能找到回家的路
寫了7763篇文章,獲得2次喜歡
留言回覆
回覆
精彩推薦