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

 更新时间:2026年01月30日 09:07:14   作者:Лапка  
本文介绍了作者开发的一款用于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版本切换工具的资料请关注脚本之家其它相关文章!

相关文章

  • java开发中如何使用JVisualVM进行性能分析

    java开发中如何使用JVisualVM进行性能分析

    JVisualVM是由Sun提供的性能分析工具,如此强大的后盾怎能不强大?在Jdk6.0以后的版本中是自带的,配置好环境变量然后在运行中输入“JVisualVm”或直接到Jdk的安装目录的Bin目录下找到运行程序即可运行。如果是用Jdk1.5或以前版本的朋友就得要单独安装了
    2015-12-12
  • 基于servlet实现统计网页访问次数

    基于servlet实现统计网页访问次数

    这篇文章主要为大家详细介绍了基于servlet实现统计网页访问次数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 从零开始学springboot整合feign跨服务调用的方法

    从零开始学springboot整合feign跨服务调用的方法

    这篇文章主要介绍了从零开始学springboot整合feign跨服务调用的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • JAVA CountDownLatch(倒计时计数器)用法实例

    JAVA CountDownLatch(倒计时计数器)用法实例

    这篇文章主要介绍了JAVA CountDownLatch(倒计时计数器)用法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • JPA 加锁机制及@Version版本控制方式

    JPA 加锁机制及@Version版本控制方式

    这篇文章主要介绍了JPA 加锁机制及@Version版本控制方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • SpringBoot项目的多文件兼多线程上传下载

    SpringBoot项目的多文件兼多线程上传下载

    本文主要介绍了SpringBoot项目的多文件兼多线程上传下载,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Java常问面试内容--数组、声明、初始化、冒泡、多维数组、稀疏数组

    Java常问面试内容--数组、声明、初始化、冒泡、多维数组、稀疏数组

    这篇文章主要介绍了Java多线程面试题(面试官常问),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • Java zxing生成条形码和二维吗代码实例

    Java zxing生成条形码和二维吗代码实例

    这篇文章主要介绍了java zxing生成条形码和二维吗代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • java封装类型与基础类型对比示例分析

    java封装类型与基础类型对比示例分析

    这篇文章主要为大家介绍了java封装类型与基础类型对比示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • MyBatis标签之Select resultType和resultMap详解

    MyBatis标签之Select resultType和resultMap详解

    这篇文章主要介绍了MyBatis标签之Select resultType和resultMap,在MyBatis中有一个ResultMap标签,它是为了映射select标签查询出来的结果集,下面使用一个简单的例子,来介绍 resultMap 的使用方法,需要的朋友可以参考下
    2022-09-09

最新评论