最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于批處理腳本bat打造一個高效Java版本切換工具

 更新時間:2026年01月30日 09:07:14   作者:Лапка  
本文介紹了作者開發(fā)的一款用于Windows系統(tǒng)多Java版本自動化管理的批處理工具,該工具具備自動掃描JDK目錄、智能識別版本號、權(quán)限管理、雙重設(shè)置、清理重復(fù)路徑、實時驗證等功能,需要的朋友可以參考下

簡要概述

一個自動化管理Windows系統(tǒng)多Java版本的批處理工具,讓開發(fā)者可以快速、輕松地在不同Java版本之間切換。

主要特性

  1. 自動掃描:自動掃描指定目錄下的所有JDK版本
  2. 智能識別:自動提取Java版本號,清晰展示可用版本
  3. 權(quán)限管理:自動請求管理員權(quán)限,確保環(huán)境變量可以正常修改
  4. 雙重設(shè)置:同時設(shè)置系統(tǒng)和用戶環(huán)境變量
  5. 路徑清理:避免PATH變量中出現(xiàn)重復(fù)的Java路徑
  6. 實時驗證:切換后立即驗證新版本是否生效

核心代碼解析

  1. 管理員權(quán)限檢測

確保腳本以管理員權(quán)限運行,這是修改系統(tǒng)環(huán)境變量的必要條件

:: 檢查管理員權(quán)限
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if not '%errorlevel%'=='0' (
    echo 正在請求管理員權(quán)限...
    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. 環(huán)境變量智能更新

智能判斷PATH變量中是否已經(jīng)包含Java路徑,避免重復(fù)添加,保持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. 保存運行:將代碼復(fù)制到記事本,保存為ANSI編碼的.bat文件即可
  2. 權(quán)限要求:腳本需要管理員權(quán)限才能修改系統(tǒng)環(huán)境變量
  3. 路徑規(guī)范:建議使用英文路徑,避免空格和特殊字符
  4. 命名規(guī)范:JDK文件夾建議以"jdk"開頭,便于腳本識別
  5. 重啟生效:雖然當(dāng)前會話會立即更新,但已打開的應(yīng)用程序可能需要重啟
  6. 備份PATH:建議在執(zhí)行前備份當(dāng)前的PATH變量

完整代碼

@echo off
chcp 936 >nul
setlocal enabledelayedexpansion

:: 檢查管理員權(quán)限
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if not '%errorlevel%'=='0' (
    echo 正在請求管理員權(quán)限...
    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    (按回車使用默認(rèn): %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根目錄不存在!" "請確認(rèn)路徑: %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.

:: 顯示當(dāng)前Java版本
call :show_current_java

:: 選擇版本
:SELECT_VERSION
echo     請選擇要切換的版本 (1-!JDK_COUNT!)
echo     (輸入 0 返回主菜單)
echo.
set /p "CHOICE=    選擇: "

:: 檢查是否為數(shù)字
echo !CHOICE!|findstr /r "^[0-9][0-9]*$" >nul 2>&1
if errorlevel 1 (
    call :show_error "請輸入有效的數(shù)字!"
    goto SELECT_VERSION
)

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

:: 檢查是否在有效范圍內(nèi)
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.

:: 確認(rèn)操作
echo     確認(rèn)要切換到此版本嗎? (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

:: ========== 函數(shù)定義區(qū)域 ==========

: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     當(dāng)前Java環(huán)境:
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環(huán)境
)
echo     ──────────────────────────────────────
echo.
goto :eof

:switch_java_version
call :show_header "正在設(shè)置環(huán)境變量"

:: 設(shè)置JAVA_HOME
echo     [1] 設(shè)置系統(tǒng)JAVA_HOME...
setx JAVA_HOME "!SELECTED_PATH!" /M >nul && (
    echo     √ 系統(tǒng)JAVA_HOME已設(shè)置
) || (
    echo     × 設(shè)置系統(tǒng)JAVA_HOME失敗
)

echo     [2] 設(shè)置用戶JAVA_HOME...
setx JAVA_HOME "!SELECTED_PATH!" >nul && (
    echo     √ 用戶JAVA_HOME已設(shè)置
) || (
    echo     × 設(shè)置用戶JAVA_HOME失敗
)

:: 更新PATH變量
echo     [3] 更新系統(tǒng)PATH...
call :update_path "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "系統(tǒng)"

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

:: 更新當(dāng)前會話
echo     [5] 更新當(dāng)前會話...
set JAVA_HOME=!SELECTED_PATH!
for %%p in ("!SELECTED_PATH!\bin") do set "PATH=%%~p;%PATH%"
echo     √ 當(dāng)前會話已更新
echo     ──────────────────────────────────────

:: 驗證切換結(jié)果
call :show_header "驗證切換結(jié)果"
if errorlevel 1 (
    echo     × 無法驗證Java版本
) else (
    echo     √ Java版本驗證成功
)
echo     JAVA_HOME: !JAVA_HOME!
echo.
echo     √ 切換完成!
echo     注意: 已打開的應(yīng)用程序需要重啟才能生效
echo     ──────────────────────────────────────
goto :eof

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

:: 獲取當(dāng)前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已設(shè)置為%%JAVA_HOME%%\bin
    ) || (
        echo     × 設(shè)置!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     按任意鍵繼續(xù)...
pause >nul
goto :eof

效果預(yù)覽

以上就是基于批處理腳本bat打造一個高效Java版本切換工具的詳細(xì)內(nèi)容,更多關(guān)于bat Java版本切換工具的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 云服務(wù)器環(huán)境搭建及部署(jdk、mysql、redis、nginx環(huán)境搭建)詳細(xì)步驟

    云服務(wù)器環(huán)境搭建及部署(jdk、mysql、redis、nginx環(huán)境搭建)詳細(xì)步驟

    這篇文章主要給大家介紹了關(guān)于云服務(wù)器環(huán)境搭建及部署(jdk、mysql、redis、nginx環(huán)境搭建)詳細(xì)步驟的相關(guān)資料,要在云服務(wù)器上搭建JDK、MySQL、Redis和Nginx的環(huán)境,可以按照以下步驟進行操作,需要的朋友可以參考下
    2024-01-01
  • Junit 5中@ParameterizedTest與@EnumSource結(jié)合使用

    Junit 5中@ParameterizedTest與@EnumSource結(jié)合使用

    今天小編就為大家分享一篇關(guān)于Junit 5中@ParameterizedTest與@EnumSource結(jié)合使用,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • SpringBoot全局異常處理之多個處理器匹配順序(最新推薦)

    SpringBoot全局異常處理之多個處理器匹配順序(最新推薦)

    這篇文章主要介紹了SpringBoot全局異常處理之多個處理器匹配順序(最新推薦),調(diào)試源碼可見匹配順序為:異常層級高者優(yōu)先,再清楚點,子類異常處理器優(yōu)先,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2024-03-03
  • 基于SpringBoot實現(xiàn)分布式鎖的三種方法

    基于SpringBoot實現(xiàn)分布式鎖的三種方法

    這篇文章主要為大家詳細(xì)介紹了基于SpringBoot實現(xiàn)分布式鎖的三種方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-12-12
  • Java多線程案例之阻塞隊列詳解

    Java多線程案例之阻塞隊列詳解

    阻塞隊列是一種特殊的隊列.?也遵守?“先進先出”?的原則.阻塞隊列能是一種線程安全的數(shù)據(jù)結(jié)構(gòu)。本文將通過一些示例為大家詳細(xì)講講阻塞隊列的原理與使用,感興趣的小伙伴可以學(xué)習(xí)一下
    2022-10-10
  • SpringBoot中配置文件pom.xml的使用詳解

    SpringBoot中配置文件pom.xml的使用詳解

    SpringBoot的pom.xml文件是Maven項目的核心配置文件,用于定義項目的依賴、插件、構(gòu)建配置等信息,下面小編就來和大家詳細(xì)介紹一下它的具體使用吧
    2025-03-03
  • Java基礎(chǔ)類之ArrayUtils工具類詳解

    Java基礎(chǔ)類之ArrayUtils工具類詳解

    這篇文章主要介紹了java.ArrayDeque類使用方法,java.ArrayDeque類提供了可調(diào)整大小的陣列,并實現(xiàn)了Deque接口,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java Stream 的 limit 與 skip 使用場景操作分析

    Java Stream 的 limit 與 skip 使用場

    Java Stream的limit與skip操作用于控制元素數(shù)量,limit截取前N個元素,具備短路特性,適合無限流和性能優(yōu)化,skip跳過前N個元素,常用于分頁,兩者結(jié)合可實現(xiàn)數(shù)據(jù)切片,但需注意順序依賴性和性能陷阱,本文介紹Java Stream的limit與skip使用場景操作分析,感興趣的朋友一起看看吧
    2025-07-07
  • SpringBoot接口返回結(jié)果封裝方法實例詳解

    SpringBoot接口返回結(jié)果封裝方法實例詳解

    在實際項目中,一般會把結(jié)果放在一個封裝類中,封裝類中包含http狀態(tài)值,狀態(tài)消息,以及實際的數(shù)據(jù)。這里主要記錄兩種方式,通過實例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-09-09
  • 詳解java并發(fā)之重入鎖-ReentrantLock

    詳解java并發(fā)之重入鎖-ReentrantLock

    這篇文章主要介紹了java并發(fā)之重入鎖-ReentrantLock,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評論

中牟县| 罗江县| 乐清市| 石家庄市| 桓仁| 新乡市| 海门市| 衡水市| 大埔区| 确山县| 临沭县| 清原| 汪清县| 赣榆县| 信宜市| 黄浦区| 隆化县| 罗城| 嘉禾县| 泰顺县| 临猗县| 日土县| 郑州市| 丹凤县| 云和县| 新津县| 常山县| 广饶县| 连州市| 本溪市| 资溪县| 黄山市| 邓州市| 奉化市| 宜兰县| 云和县| 西乌| 锦州市| 林甸县| 临邑县| 苗栗市|