我正在尝试查找当前安装的 java JDK 版本和主文件夹。
我正在尝试此代码,但我无法找出分隔符和标记的正确“组合”,以便忽略路径中的空格。
@echo off
rem "JavaHome REG_SZ C:\Program Files\Java\jdk-17.0.2"
setlocal
for /F "tokens=3" %%A in ('reg query "HKLM\SOFTWARE\JavaSoft\JDK" /v "CurrentVersion"') DO (set java_version=%%A)
rem echo C:\Program Files\Java\jdk-%java_version%
for /F "tokens=3-5 " %%B in ('reg query "HKLM\SOFTWARE\JavaSoft\JDK\%java_version%" /v "JavaHome"') DO (set java_home=%%B)
echo %java_version%
echo "%java_home%"
endlocal
pause
我尝试使用制表符作为分隔符,尝试了 4 个空格,因为字符串就是用这个,但我仍然得到空字符串""
或仅得到"C:\Program"
第二个变量java_home
答案1
你试一试:
@echo off & setlocal
for /F tokens^=2* %%A in ('
reg query "HKLM\SOFTWARE\JavaSoft\JDK" /v "CurrentVersion"
')do set "_java_version=%%~B"
echo C:\Program Files\Java\jdk-%_java_version%
for /F tokens^=2* %%A in ('
reg query "HKLM\SOFTWARE\JavaSoft\JDK\%_java_version%" /v "JavaHome"
')do set "_java_home=%%~B"
echo %_java_version% & echo "%_java_home%"
endlocal & pause
观察1:以管理员身份运行
观察2:使用“ \
”作为注册码,使用“ -
”作为路径文件夹:
:: "HKLM\SOFTWARE\JavaSoft\JDK \ %_java_version%"
:: ...\JDK + \ + %_java_version%"
:: "C:\Program Files\Java\jdk - %_java_version%"
:: ...\jdk + - + %_java_version%"
观察3:要设置系统变量,请使用setx
命令
@echo off & setlocal
for /F tokens^=2* %%A in ('
reg query "HKLM\SOFTWARE\JavaSoft\JDK" /v "CurrentVersion"
')do set "_java_version=%%~B"
echo C:\Program Files\Java\jdk-%_java_version%
for /F tokens^=2* %%A in ('
reg query "HKLM\SOFTWARE\JavaSoft\JDK\%_java_version%" /v "JavaHome"
')do set "_java_home=%%~B"
setx /M java_home "%_java_home%"
setx /M java_version "%_java_version%"
echo %_java_version% & echo "%_java_home%"
endlocal & pause
我可能应该提到我也尝试过:
java -XshowSettings:properties -version 2>&1 | findstr "java.home"
但是该输出字符串的格式没有提供太多选项来获取路径。将此尝试移植到循环和子字符串可以获得您想要的内容,而无需以管理员身份运行......
@echo off & setlocal
for /f tokens^=2* %%A in ('
2^>^&1 java -XshowSettings:properties -version ^| find /i "a.h"
')do set "_java_home=%%~B" && set "_ver=%%~nxB"
set "_java_version=%_ver:*-=%"
echo %java_version% & echo "%java_home%"
endlocal & pause
或者不使用子字符串,但使用两个For
循环:
@echo off & setlocal
for /f tokens^=2* %%A in (
'2^>^&1 java -XshowSettings:properties -version^|find "a.h"
')do set "_java_home=%%~B"
for /f tokens^=2delims^=^" %%A in ('
2^>^&1 java -XshowSettings:properties -version^|findstr \^"
')do set "_java_version=%%~A"
echo\%_java_home% # %_java_version%
endlocal & pause
观察4.如果您要使用此选项并添加命令Setx /m
,则需要以管理员身份运行:
@echo off & setlocal
for /f tokens^=2* %%A in ('
2^>^&1 java -XshowSettings:properties -version ^| find /i "a.h"
')do set "_java_home=%%~B" && set "_ver=%%~nxB"
set "_java_version=%_ver:*-=%"
setx /M java_home "%_java_home%"
setx /M java_version "%_java_version%"
endlocal & pause