為什麼用批處理?
- 圖形界面操作繁瑣、易出錯、難複製到多台機器。
- 批處理可腳本化、版本控制、自動化部署 (Ansible/PowerShell/批處理均可)。
- 關鍵點:需寫入 系統環境變量 (HKLM),而非用戶變量 (HKCU);需管理員權限運行。
標準配置腳本 (setx 命令)
@echo off
rem ===== 配置區 =====
set "JAVA_HOME=C:\Program Files\Java\jdk-17"
rem ===================
echo 正在設置系統環境變量 (需管理員權限)...
setx -m JAVA_HOME "%JAVA_HOME%"
setx -m Path "%Path%;%%JAVA_HOME%%\bin"
setx -m CLASSPATH ".;%%JAVA_HOME%%\lib\dt.jar;%%JAVA_HOME%%\lib\tools.jar"
echo.
echo 當前設置結果:
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v JAVA_HOME
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v CLASSPATH
echo.
echo 請重新打開 CMD/PowerShell 使變量生效。
pause
關鍵參數解析
| 命令 | 作用 |
setx -m VAR "VALUE" | 設置系統級環境變量 (寫入注冊表 HKLM),永久生效,下一進程生效。 |
%Path% | 引用現有 Path,追加新路徑。批處理中 % 需轉義為 %%。 |
%%JAVA_HOME%%\bin | 展開為 %JAVA_HOME%\bin,確保 Path 中保留可展開的變量引用。 |
驗證腳本
@echo off
echo 驗證 javac & java...
javac -version
java -version
echo.
echo 環境變量值:
echo JAVA_HOME=%JAVA_HOME%
echo.
pause
進階:自動檢測 JDK 安裝路徑
@echo off
set "JAVA_DIR="
for /d %%i in ("C:\Program Files\Java\jdk*") do set "JAVA_DIR=%%i"
if not defined JAVA_DIR (
echo 未檢測到 JDK 安裝目錄,請手動指定。
pause & exit /b 1
)
echo 檢測到: %JAVA_DIR%
setx -m JAVA_HOME "%JAVA_DIR%"
setx -m Path "%Path%;%%JAVA_DIR%%\bin"
setx -m CLASSPATH ".;%%JAVA_DIR%%\lib\dt.jar;%%JAVA_DIR%%\lib\tools.jar"
echo 完成。請重啟終端。
pause
注意事項
- 管理員權限:右鍵「以管理員身份運行」,否則
setx -m 失敗 (拒絕訪問)。
- 路徑含空格:用雙引號包裹
"C:\Program Files\..."。
CLASSPATH:JDK 9+ 模組化後通常不再需要,保留兼容舊項目。
- 修改後 必須重啟終端/IDE 才能讀取新變量。
- PowerShell 替代方案:
[Environment]::SetEnvironmentVariable('JAVA_HOME', $path, 'Machine')。