基于批处理脚本bat打造一个高效Java版本切换工具
更新时间:2026年01月30日 09:07:14 作者:Лапка
本文介绍了作者开发的一款用于Windows系统多Java版本自动化管理的批处理工具,该工具具备自动扫描JDK目录、智能识别版本号、权限管理、双重设置、清理重复路径、实时验证等功能,需要的朋友可以参考下
简要概述
一个自动化管理Windows系统多Java版本的批处理工具,让开发者可以快速、轻松地在不同Java版本之间切换。
主要特性
- 自动扫描:自动扫描指定目录下的所有JDK版本
- 智能识别:自动提取Java版本号,清晰展示可用版本
- 权限管理:自动请求管理员权限,确保环境变量可以正常修改
- 双重设置:同时设置系统和用户环境变量
- 路径清理:避免PATH变量中出现重复的Java路径
- 实时验证:切换后立即验证新版本是否生效
核心代码解析
- 管理员权限检测
确保脚本以管理员权限运行,这是修改系统环境变量的必要条件
:: 检查管理员权限
>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
)
- 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
)
- 环境变量智能更新
智能判断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
)
注意事项
- 保存运行:将代码复制到记事本,保存为ANSI编码的.bat文件即可
- 权限要求:脚本需要管理员权限才能修改系统环境变量
- 路径规范:建议使用英文路径,避免空格和特殊字符
- 命名规范:JDK文件夹建议以"jdk"开头,便于脚本识别
- 重启生效:虽然当前会话会立即更新,但已打开的应用程序可能需要重启
- 备份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版本切换工具的资料请关注脚本之家其它相关文章!
相关文章
从零开始学springboot整合feign跨服务调用的方法
这篇文章主要介绍了从零开始学springboot整合feign跨服务调用的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-03-03
JAVA CountDownLatch(倒计时计数器)用法实例
这篇文章主要介绍了JAVA CountDownLatch(倒计时计数器)用法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2019-10-10
Java常问面试内容--数组、声明、初始化、冒泡、多维数组、稀疏数组
这篇文章主要介绍了Java多线程面试题(面试官常问),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-07-07
MyBatis标签之Select resultType和resultMap详解
这篇文章主要介绍了MyBatis标签之Select resultType和resultMap,在MyBatis中有一个ResultMap标签,它是为了映射select标签查询出来的结果集,下面使用一个简单的例子,来介绍 resultMap 的使用方法,需要的朋友可以参考下2022-09-09


最新评论