如何使用批处理正确找到 java 主文件夹?

如何使用批处理正确找到 java 主文件夹?

我正在尝试查找当前安装的 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

相关内容