Repository: chroblert/JC-jEnv Branch: master Commit: a6b3388822a3 Files: 3 Total size: 11.6 KB Directory structure: gitextract_e5idpx28/ ├── README.md ├── jEnv.bat └── null ================================================ FILE CONTENTS ================================================ ================================================ FILE: README.md ================================================ # JC-jEnv > Author: JC0o0l,Jerrybird > > GitHub: https://github.com/chroblert/JC-jEnv.git > > WeChat: JC_SecNotes(Zer0ne安全研究) ## 0x00 用途 Java版本切换工具,可以很方便的在java的多个版本之间切换。可以设置只在当前的终端中生效还是在全局都生效。 ## 0x01 原理: - 通过reg,set,setx等命令修改或刷新JAVA_HOME,PATH,``等环境变量以及注册表。 - 将添加的``保存到用户环境变量JC_jEnv中 - 通过call来达到多重嵌套的效果 - 通过doskey来设置命令别名 ## 0x02 效果: `jenv -h` ![1611209361297.png](img/1611209361297.png) `jenv local java9` ![1611210131816.png](img/1611210131816.png) `jenv version` ![1611210177545.png](img/1611210177545.png) `jenv del java9` ![1611210266710.png](img/1611210266710.png) `jenv add d:\11-java\jdk-9.0.4 java9` ![1611210250119.png](img/1611210250119.png) ## 0x03 参数说明: `jenv [options]` options如下 - version - 显示当前设置的所有的java版本 - local `` - 设置java版本,只在当前shell下起作用 - global `` - 设置java版本,在全局下都起作用 - add <目录> `` - 添加一个版本的java。 - 如:`jenv add d:\java\jdk-9.0.4 java9` - del `` - 删除一个版本的java - 如:`jenv del java9` ## 0x04 使用说明: 1. 将该bat脚本添加到PATH系统环境变量中 这样使用的时候,可以直接输入`jenv` 2. 用户环境变量PATH中使用%JAVA_HOME%\bin path环境变量中不能有具体的java路径,要使用%JAVA_HOME%\bin的方式,无论系统环境变量还是用户环境变量 3. 删除系统环境变量中的JAVA_HOME 因为生成path环境变量的时候,系统变量中的path>用户环境变量中的path。而要修改系统环境变量,需要管理员权限,所以该程序只修改了用户环境变量。 注: > - 系统环境变量中PATH值中的路径下不能有java.exe。如:C:\windows\system32路径下有8版本的java.exe,则全局无法生效,即:即使jenv global java13,但每次新创建的cmd下运行的java都是C:\windows\system32路径下的那个。 > - 该脚本使用用户环境变量,因而系统环境变量中不能有JAVA_HOME变量 ## 0x05 测试环境 |序号|系统|版本|是否支持| |---|-|--|--------| |1|Windows 10|专业版|支持| |2| | | | |3| | | | |4| | | | ## 参考资料: 参考资料:[windows系统一键配置修改环境变量](https://www.jianshu.com/p/7d90042f644f) 参考资料:[Windows设置cmd别名](https://blog.csdn.net/YiRanZhiLiPoSui/article/details/83116819) 参考资料:[setx设置永久环境变量](https://blog.csdn.net/fm0517/article/details/52450940) 参考资料:[刷新环境变量](https://github.com/chocolatey/choco/blob/master/src/chocolatey.resources/redirects/RefreshEnv.cmd) 参考资料:[batch之变量延迟](https://www.cnblogs.com/ini_always/archive/2012/02/16/2355031.html) 参考资料:[was unexpect at this time](https://stackoom.com/question/2pffV/%E8%9D%99%E8%9D%A0-Set%E5%91%BD%E4%BB%A4%E5%9C%A8%E6%8B%AC%E5%8F%B7%E5%86%85%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8) 参考资料:[批处理变量多重嵌套](https://www.cnblogs.com/xxcanghai/p/4584042.html) 参考资料:[环境变量中特殊字符()的问题](https://qastack.cn/superuser/119610/spaces-and-parenthesis-in-windows-path-variable-screws-up-batch-files) 参考资料:[setx1024个字符限制的解决方法](https://qastack.cn/superuser/387619/overcoming-the-1024-character-limit-with-setx) ================================================ FILE: jEnv.bat ================================================ @echo off chcp 65001 @REM AUTHOR: JC0o0l,Jerrybird @REM description: java环境切换管理工具 @REM Repo: https://github.com/Chroblert/JC-jEnv.git @REM set JC_jEnv=JC_jEnv if "%1" == "local" ( echo |set /p JCOut=" [+] jenv local alias" echo. goto switch_local ) if "%1" == "global" ( echo | set /p JCOut=" [+] jenv global alias" echo. goto switch_global ) if "%1" == "add" ( echo | set /p JCOut=" [+] jenv add jdk_dir alias" echo. goto addjdk ) if "%1" == "del" ( echo | set /p JCOut=" [+] jenv del alias" echo. goto deljdk ) if "%1" == "version" ( goto version ) :usage @REM echo | set /p JCOut=" ================================================" echo ================================================ @REM echo. echo | set /p JCOut=" | JC-jEnv" echo. echo | set /p JCOut=" | Despt: windows Java环境管理工具" echo. echo | set /p JCOut=" | Author: JC0o0l,Jerrybird" echo. echo | set /p JCOut=" | Repo: https://github.com/chroblert/JC-jEnv.git" echo. @REM echo | set /p JCOut=" ================================================" echo ================================================ echo. echo | set /p JCOut=" 使用说明" echo. echo | set /p JCOut=" jenv [options]" echo. echo | set /p JCOut=" version " echo. echo | set /p JCOut=" - 显示当前所有的java版本" echo. echo | set /p JCOut=" local alias " echo. echo | set /p JCOut=" - 设置java版本,只在当前shell下起作用" echo. echo | set /p JCOut=" global alias " echo. echo | set /p JCOut=" - 设置java版本,在全局下都起作用" echo. echo | set /p JCOut=" add 目录 alias" echo. echo | set /p JCOut=" - add a version " echo. echo | set /p JCOut=" del alias " echo. echo | set /p JCOut=" - delete a version" echo. goto end :version if "%JC_jEnv%" == "" ( echo | set /p JCOut=" 当前没有设置任何版本" echo. goto usage ) @REM 枚举JC_jEnv环境变量中的值 echo. echo | set /p JCOut=" all version:" echo. set remain=%JC_jEnv% setlocal enabledelayedexpansion :loop for /f "delims=;, tokens=1*" %%i in ("%remain%") do ( @REM echo | set /p JCOut=" %%i" @REM echo. set jenv_name=%%i set value=!%%i! if /i "!value!" equ "%JAVA_HOME%" ( echo | set /p JCOut=" * !jenv_name! !value!" echo. ) else ( echo | set /p JCOut=" !jenv_name! !value!" echo. ) set remain=%%j ) if defined remain goto :loop setlocal disabledelayedexpansion goto end @REM 导出配置到文件 :export goto end @REM 导入配置文件 :import goto end :switch_local @REM call refreshenv set Java_env=%2 @REM 多重变量嵌套 call set TMP_JAVAHOME=%%%Java_env%%% set java_path= if NOT "%2" == "" ( set java_path=%TMP_JAVAHOME%\bin ) if "%java_path%" == "" ( @REM 将(,)转义为^(,^) goto end ) set "path=%java_path%;%path%" set "JAVA_HOME=%TMP_JAVAHOME%" echo | set /p JCOut=" 已切换到%2 %java_path%" echo. @REM rem 设置别名 %SystemRoot%\system32\doskey %2=%JAVA_HOME%\bin\java.exe $* >null set java_path= set TMP_JAVAHOME= goto end :switch_global @REM call refreshenv set Java_env=%2 @REM 多重变量嵌套 call set TMP_JAVAHOME=%%%Java_env%%% set java_path= if "%2" == "" ( goto end ) set java_path=%TMP_JAVAHOME%\bin if "%java_path%" == "" ( goto end ) REM 设置java_home环境变量 reg delete HKCU\Environment /v JAVA_HOME /f >null echo | set /p JCOut=" .使用reg删除以前的JAVA_HOME %JAVA_HOME%" echo. reg add HKCU\Environment /v JAVA_HOME /t REG_SZ /d %TMP_JAVAHOME% /f >null echo | set /p JCOut=" .使用reg创建新的JAVA_HOME %TMP_JAVAHOME%" echo. setx JAVA_HOME %TMP_JAVAHOME% >null echo | set /p JCOut=" .使用setx更新JAVA_HOME" echo. @REM 更新本shell中path set "path=%java_path%;%path%" set "JAVA_HOME=%TMP_JAVAHOME%" @REM rem 设置别名 %SystemRoot%\system32\doskey %2=%JAVA_HOME%\bin\java.exe $* >null @REM echo | set /p JCOut=" "%path%"" @REM echo. set java_path= set TMP_JAVAHOME= goto end :setpathusereg echo | set /p JCOut=" 使用注册表设置PATH环境变量" echo. echo | set /p JCOut=" %~1 %~2" echo. reg delete HKCU\Environment /v %~1 /f reg add HKCU\Environment /v %~1 /t REG_SZ /d "%~2" /f call refreshenv goto :EOF @REM reg add "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" /v JAVA_HOME /t REG_SZ /d "%~1" /f :deljdk if NOT "%~2" == "" ( @REM 删除某个版本的jdk reg delete HKCU\Environment /v %~2 /f >null ) call set t_JC_jEnv=%%JC_jEnv:;%~2=%% call setx JC_jEnv %%t_JC_jEnv:%~2;=%% call set JC_jEnv=%%t_JC_jEnv:%~2;=%% set %~2= goto refreshenv :addjdk rem echo | set /p JCOut=" [+] jenv add jdk_dir alias" rem echo. if [%2] == [] ( echo | set /p JCOut=" 请设置JDK路径" echo. goto end ) if [%3] == [] ( echo | set /p JCOut=" 请设置JDK别名" echo. goto end ) if %2 == "" ( echo | set /p JCOut=" 请设置JDK路径" echo. goto end ) if %3 == "" ( echo | set /p JCOut=" 请设置JDK别名" echo. goto end ) set JDK_ALIAS=%3 set JDK_DIR=%2 @REM 判断是否存在JDK_ALIAS别名 call set t_temp=%%%JDK_ALIAS%%% if NOT "%t_temp%" == "" ( echo | set /p JCOut=" %JDK_ALIAS%已经存在" echo. goto end ) rem 添加至用户环境变量中 %SystemRoot%\system32\setx %JDK_ALIAS% %JDK_DIR% >null @REM echo | set /p JCOut="/%SystemRoot%\system32\setx %JDK_ALIAS% %JDK_DIR% >>f:/JC_jEnv.cmd" @REM echo. echo | set /p JCOut="%JC_jEnv%"|%SystemRoot%\system32\findstr "%JDK_ALIAS%" >nul echo. set notexist=%errorlevel% @REM 环境变量JC_jEnv中已存在当前要添加JAVA_ALIAS if %notexist% == 0 ( echo | set /p JCOut=" 已设置过该版本的java" echo. goto end ) @REM 保存添加的环境变量到JC_jEnv中 if "%JC_jEnv%" == "" ( echo | set /p JCOut=" 用户环境变量中没有JC_jEnv" echo. %SystemRoot%\system32\setx JC_jEnv "%JDK_ALIAS%" >null @REM echo | set /p JCOut="/%SystemRoot%\system32\setx JC_jEnv "%JDK_ALIAS%" >>f:/JC_jEnv.cmd" @REM echo. ) else ( %SystemRoot%\system32\setx JC_jEnv "%JDK_ALIAS%;%JC_jEnv%" >null @REM echo | set /p JCOut="/%SystemRoot%\system32\setx JC_jEnv "%JDK_ALIAS%;%JC_jEnv%" >>f:/JC_jEnv.cmd" @REM echo. ) @REM rem 设置别名 %SystemRoot%\system32\doskey %JDK_ALIAS%=%JDK_DIR%\bin\java.exe $* >null @REM echo | set /p JCOut="/%SystemRoot%\system32\doskey %JDK_ALIAS%=%JDK_DIR%\bin\java.exe $* >>f:/JC_jEnv.cmd" @REM echo. echo | set /p JCOut=" 已为%JDK_DIR%\bin\java.exe设置别名%JDK_ALIAS%" echo. @REM 清空定义的变量 @REM set JDK_ALIAS= set JDK_DIR= @REM 刷新环境变量 goto refreshenv :refreshenv @echo off :: :: RefreshEnv.cmd :: :: Batch file to read environment variables from registry and :: set session variables to these values. :: :: With this batch file, there should be no need to reload command :: environment every time you want environment changes to propagate ::echo "RefreshEnv.cmd only works from cmd.exe, please install the Chocolatey Profile to take advantage of refreshenv from PowerShell" echo | set /p dummy="Refreshing environment variables from registry for cmd.exe. Please wait..." goto main :: Set one environment variable from registry key :SetFromReg "%WinDir%\System32\Reg" QUERY "%~1" /v "%~2" > "%TEMP%\_envset.tmp" 2>NUL for /f "usebackq skip=2 tokens=2,*" %%A IN ("%TEMP%\_envset.tmp") do ( echo/set "%~3=%%B" ) goto :EOF :: Get a list of environment variables from registry :GetRegEnv "%WinDir%\System32\Reg" QUERY "%~1" > "%TEMP%\_envget.tmp" for /f "usebackq skip=2" %%A IN ("%TEMP%\_envget.tmp") do ( if /I not "%%~A"=="Path" ( call :SetFromReg "%~1" "%%~A" "%%~A" ) ) goto :EOF :main echo/@echo off >"%TEMP%\_env.cmd" :: Slowly generating final file call :GetRegEnv "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" >> "%TEMP%\_env.cmd" call :GetRegEnv "HKCU\Environment">>"%TEMP%\_env.cmd" >> "%TEMP%\_env.cmd" :: Special handling for PATH - mix both User and System call :SetFromReg "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" Path Path_HKLM >> "%TEMP%\_env.cmd" call :SetFromReg "HKCU\Environment" Path Path_HKCU >> "%TEMP%\_env.cmd" :: Caution: do not insert space-chars before >> redirection sign echo/set "Path=%%Path_HKLM%%;%%Path_HKCU%%" >> "%TEMP%\_env.cmd" :: Cleanup del /f /q "%TEMP%\_envset.tmp" 2>nul del /f /q "%TEMP%\_envget.tmp" 2>nul :: capture user / architecture SET "OriginalUserName=%USERNAME%" SET "OriginalArchitecture=%PROCESSOR_ARCHITECTURE%" :: Set these variables call "%TEMP%\_env.cmd" :: Cleanup del /f /q "%TEMP%\_env.cmd" 2>nul :: reset user / architecture SET "USERNAME=%OriginalUserName%" SET "PROCESSOR_ARCHITECTURE=%OriginalArchitecture%" echo | set /p dummy="Finished." echo . goto :EOF :end echo. echo Done ================================================ FILE: null ================================================