Full Code of chroblert/JC-jEnv for AI

master a6b3388822a3 cached
3 files
11.6 KB
4.3k tokens
1 requests
Download .txt
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,`<alias>`等环境变量以及注册表。

- 将添加的`<alias>`保存到用户环境变量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 `<alias>` 
   - 设置java版本,只在当前shell下起作用
- global `<alias>`
   - 设置java版本,在全局下都起作用
- add <目录> `<alias>`
   - 添加一个版本的java。
   - 如:`jenv add d:\java\jdk-9.0.4 java9`
- del `<alias>`   
   - 删除一个版本的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
================================================
Download .txt
gitextract_e5idpx28/

├── README.md
├── jEnv.bat
└── null
Condensed preview — 3 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (14K chars).
[
  {
    "path": "README.md",
    "chars": 2507,
    "preview": "# JC-jEnv\n\n> Author: JC0o0l,Jerrybird\n> \n> GitHub: https://github.com/chroblert/JC-jEnv.git\n> \n> WeChat: JC_SecNotes(Zer"
  },
  {
    "path": "jEnv.bat",
    "chars": 9337,
    "preview": "@echo off\nchcp 65001\n@REM AUTHOR: JC0o0l,Jerrybird\n@REM description: java环境切换管理工具\n@REM Repo: https://github.com/Chrobler"
  },
  {
    "path": "null",
    "chars": 0,
    "preview": ""
  }
]

About this extraction

This page contains the full source code of the chroblert/JC-jEnv GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 3 files (11.6 KB), approximately 4.3k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!