java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > bat Java版本切换工具

基于批处理脚本bat打造一个高效Java版本切换工具

作者:Лапка

本文介绍了作者开发的一款用于Windows系统多Java版本自动化管理的批处理工具,该工具具备自动扫描JDK目录、智能识别版本号、权限管理、双重设置、清理重复路径、实时验证等功能,需要的朋友可以参考下

简要概述

一个自动化管理Windows系统多Java版本的批处理工具,让开发者可以快速、轻松地在不同Java版本之间切换。

主要特性

  1. 自动扫描:自动扫描指定目录下的所有JDK版本
  2. 智能识别:自动提取Java版本号,清晰展示可用版本
  3. 权限管理:自动请求管理员权限,确保环境变量可以正常修改
  4. 双重设置:同时设置系统和用户环境变量
  5. 路径清理:避免PATH变量中出现重复的Java路径
  6. 实时验证:切换后立即验证新版本是否生效

核心代码解析

  1. 管理员权限检测

确保脚本以管理员权限运行,这是修改系统环境变量的必要条件

:: 检查管理员权限
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if not '%errorlevel%'=='0' (
    echo 正在请求管理员权限...
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
    "%temp%\getadmin.vbs"
    exit /b
)
  1. JDK版本扫描与识别

自动扫描指定目录下所有以"jdk"开头的文件夹,并智能提取版本号

:: 扫描Java版本
set "JDK_COUNT=0"
echo     正在扫描: %JAVA_ROOT%
echo     ──────────────────────────────────────

for /d %%i in ("%JAVA_ROOT%jdk*") do (
    set /a JDK_COUNT+=1
    set "JDK_PATH[!JDK_COUNT!]=%%i"
    
    :: 提取版本号
    for /f "tokens=1 delims=_" %%v in ("%%~nxi") do (
        set "folder=%%v"
    )
    set "JDK_VER[!JDK_COUNT!]=!folder:~3!"
    echo     [!JDK_COUNT!] JDK !folder:~3! - %%i
)
  1. 环境变量智能更新

智能判断PATH变量中是否已经包含Java路径,避免重复添加,保持PATH的整洁。

:update_path
set "REG_PATH=%~1"
set "PATH_TYPE=%~2"

:: 检查是否已包含Java路径
echo !CURRENT_PATH! | findstr /c:"%%JAVA_HOME%%\bin" >nul
if !errorlevel!==1 (
    echo !CURRENT_PATH! | findstr /i "java jdk jre" >nul
    if !errorlevel!==1 (
        set "NEW_PATH=!CURRENT_PATH!;%%JAVA_HOME%%\bin"
        reg add "%REG_PATH%" /v Path /d "!NEW_PATH!" /f >nul 2>&1 && (
            echo     √ !PATH_TYPE!PATH已添加%%JAVA_HOME%%\bin
        ) || (
            echo     × 更新!PATH_TYPE!PATH失败
        )
    ) else (
        echo     !PATH_TYPE!PATH中已包含其他Java路径
    )
) else (
    echo     !PATH_TYPE!PATH中已包含%%JAVA_HOME%%\bin
)

注意事项

  1. 保存运行:将代码复制到记事本,保存为ANSI编码的.bat文件即可
  2. 权限要求:脚本需要管理员权限才能修改系统环境变量
  3. 路径规范:建议使用英文路径,避免空格和特殊字符
  4. 命名规范:JDK文件夹建议以"jdk"开头,便于脚本识别
  5. 重启生效:虽然当前会话会立即更新,但已打开的应用程序可能需要重启
  6. 备份PATH:建议在执行前备份当前的PATH变量

完整代码

@echo off
chcp 936 >nul
setlocal enabledelayedexpansion

:: 检查管理员权限
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if not '%errorlevel%'=='0' (
    echo 正在请求管理员权限...
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
    "%temp%\getadmin.vbs"
    exit /b
)

title Java版本切换工具 [管理员模式]
set "DEFAULT_ROOT=D:\java"

:MAIN_MENU
call :init_screen

:: 获取Java根目录
echo    请输入Java安装根目录
echo    (按回车使用默认: %DEFAULT_ROOT%)
echo.
set /p "JAVA_ROOT=    目录: "
echo.

if "%JAVA_ROOT%"=="" set "JAVA_ROOT=%DEFAULT_ROOT%"
if not "%JAVA_ROOT:~-1%"=="\" set "JAVA_ROOT=%JAVA_ROOT%\"

if not exist "%JAVA_ROOT%" (
    call :show_error "Java根目录不存在!" "请确认路径: %JAVA_ROOT%"
    call :pause_and_continue
    goto MAIN_MENU
)

:: 扫描Java版本
set "JDK_COUNT=0"
echo     正在扫描: %JAVA_ROOT%
echo     ──────────────────────────────────────

for /d %%i in ("%JAVA_ROOT%jdk*") do (
    set /a JDK_COUNT+=1
    set "JDK_PATH[!JDK_COUNT!]=%%i"
    
    :: 提取版本号
    for /f "tokens=1 delims=_" %%v in ("%%~nxi") do (
        set "folder=%%v"
    )
    set "JDK_VER[!JDK_COUNT!]=!folder:~3!"
    echo     [!JDK_COUNT!] JDK !folder:~3! - %%i
)

if !JDK_COUNT!==0 (
    call :show_error "未找到任何Java版本!" "请确保目录包含jdk开头的文件夹"
    call :pause_and_continue
    goto MAIN_MENU
)

echo     ──────────────────────────────────────
echo.

:: 显示当前Java版本
call :show_current_java

:: 选择版本
:SELECT_VERSION
echo     请选择要切换的版本 (1-!JDK_COUNT!)
echo     (输入 0 返回主菜单)
echo.
set /p "CHOICE=    选择: "

:: 检查是否为数字
echo !CHOICE!|findstr /r "^[0-9][0-9]*$" >nul 2>&1
if errorlevel 1 (
    call :show_error "请输入有效的数字!"
    goto SELECT_VERSION
)

:: 检查是否返回主菜单
if "!CHOICE!"=="0" (
    echo.
    echo     返回主菜单...
    goto MAIN_MENU
)

:: 检查是否在有效范围内
if !CHOICE! LSS 1 (
    call :show_error "选择不能小于 1!"
    goto SELECT_VERSION
)

if !CHOICE! GTR !JDK_COUNT! (
    call :show_error "选择不能大于 !JDK_COUNT!"
    goto SELECT_VERSION
)

for /l %%i in (1,1,!JDK_COUNT!) do (
    if %%i==!CHOICE! (
        set "SELECTED_PATH=!JDK_PATH[%%i]!"
        set "SELECTED_VER=!JDK_VER[%%i]!"
    )
)

call :show_header "切换信息"
echo     版本: JDK !SELECTED_VER!
echo     路径: !SELECTED_PATH!
echo     ──────────────────────────────────────
echo.

:: 确认操作
echo     确认要切换到此版本吗? (Y/N)
echo.
:CONFIRM_SWITCH
set /p "CONFIRM=    请选择: "
if /i "!CONFIRM!"=="y" (
    call :switch_java_version
    goto AFTER_SWITCH
) else if /i "!CONFIRM!"=="n" (
    echo.
    echo     取消切换,返回选择...
    goto SELECT_VERSION
) else (
    echo     请输入 Y 或 N
    goto CONFIRM_SWITCH
)

:AFTER_SWITCH
echo.
echo     操作完成,按任意键返回主菜单...
pause >nul
goto MAIN_MENU

:: ========== 函数定义区域 ==========

:init_screen
cls
echo.
echo     ╔══════════════════════════════════════════════╗
echo     ║           Java版本切换工具                   ║
echo     ╚══════════════════════════════════════════════╝
echo.
goto :eof

:show_header
echo     ──────────────────────────────────────
echo     %~1
echo     ──────────────────────────────────────
goto :eof

:show_error
echo.
echo     [错误] %~1
if not "%~2"=="" echo     %~2
echo.
goto :eof

:show_current_java
echo     当前Java环境:
echo     ──────────────────────────────────────

where java >nul 2>&1
if !errorlevel!==0 (
    for /f "tokens=*" %%v in ('java -version 2^>^&1 ^| findstr /i "version"') do (
        echo     %%v
    )
    if defined JAVA_HOME (
        echo     JAVA_HOME: !JAVA_HOME!
    )
) else (
    echo     未检测到Java环境
)
echo     ──────────────────────────────────────
echo.
goto :eof

:switch_java_version
call :show_header "正在设置环境变量"

:: 设置JAVA_HOME
echo     [1] 设置系统JAVA_HOME...
setx JAVA_HOME "!SELECTED_PATH!" /M >nul && (
    echo     √ 系统JAVA_HOME已设置
) || (
    echo     × 设置系统JAVA_HOME失败
)

echo     [2] 设置用户JAVA_HOME...
setx JAVA_HOME "!SELECTED_PATH!" >nul && (
    echo     √ 用户JAVA_HOME已设置
) || (
    echo     × 设置用户JAVA_HOME失败
)

:: 更新PATH变量
echo     [3] 更新系统PATH...
call :update_path "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "系统"

echo     [4] 更新用户PATH...
call :update_path "HKCU\Environment" "用户"

:: 更新当前会话
echo     [5] 更新当前会话...
set JAVA_HOME=!SELECTED_PATH!
for %%p in ("!SELECTED_PATH!\bin") do set "PATH=%%~p;%PATH%"
echo     √ 当前会话已更新
echo     ──────────────────────────────────────

:: 验证切换结果
call :show_header "验证切换结果"
if errorlevel 1 (
    echo     × 无法验证Java版本
) else (
    echo     √ Java版本验证成功
)
echo     JAVA_HOME: !JAVA_HOME!
echo.
echo     √ 切换完成!
echo     注意: 已打开的应用程序需要重启才能生效
echo     ──────────────────────────────────────
goto :eof

:update_path
set "REG_PATH=%~1"
set "PATH_TYPE=%~2"

:: 获取当前PATH
set "CURRENT_PATH="
for /f "tokens=2*" %%A in ('reg query "%REG_PATH%" /v Path 2^>nul') do (
    set "CURRENT_PATH=%%B"
)

if not defined CURRENT_PATH (
    reg add "%REG_PATH%" /v Path /d "%%JAVA_HOME%%\bin" /f >nul 2>&1 && (
        echo     √ !PATH_TYPE!PATH已设置为%%JAVA_HOME%%\bin
    ) || (
        echo     × 设置!PATH_TYPE!PATH失败
    )
    goto :eof
)

:: 检查是否已包含Java路径
echo !CURRENT_PATH! | findstr /c:"%%JAVA_HOME%%\bin" >nul
if !errorlevel!==1 (
    echo !CURRENT_PATH! | findstr /i "java jdk jre" >nul
    if !errorlevel!==1 (
        set "NEW_PATH=!CURRENT_PATH!;%%JAVA_HOME%%\bin"
        reg add "%REG_PATH%" /v Path /d "!NEW_PATH!" /f >nul 2>&1 && (
            echo     √ !PATH_TYPE!PATH已添加%%JAVA_HOME%%\bin
        ) || (
            echo     × 更新!PATH_TYPE!PATH失败
        )
    ) else (
        echo     !PATH_TYPE!PATH中已包含其他Java路径
    )
) else (
    echo     !PATH_TYPE!PATH中已包含%%JAVA_HOME%%\bin
)
goto :eof

:pause_and_continue
echo.
echo     按任意键继续...
pause >nul
goto :eof

效果预览

以上就是基于批处理脚本bat打造一个高效Java版本切换工具的详细内容,更多关于bat Java版本切换工具的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文