如何确定32BIT Java的位置

有些日子以来,JRE被安装在版本特定的目录中[1]。

所以我试图写一个DOS批处理或VBS脚本来确定最新安装的JRE 8 32位的位置。

但是,当检查registry项“HKEY_LOCAL_MACHINE \ SOFTWARE \ JavaSoft”时,我注意到这只包含有关64位Java运行时的信息。

那么任何想法如何确定最新安装的32位Java运行时通过DOS或vbs的位置? 这也应该考虑在系统上可以并行安装64位版本。

替代scheme可能是目录C:\ Program Files(x86)\ Java中的文件search。 但是Java运行时可能不会被安装在这个目录中。

[1] http://www.oracle.com/technetwork/java/javase/8u20-relnotes-2257729.html

JRE安装目录从JDK 8u20发行版开始,JRE将安装在特定于版本的目录中。 例如:C:\ Program Files \ Java \ jre1.8.0_20

版本特定的目录命名是有意的,并不表示JRE安装是静态的。 和早期的版本一样,只有当STATIC = 1选项被用户传递(通过命令行或者configuration文件),才能执行静态的JRE安装。

Solutions Collecting From Web of "如何确定32BIT Java的位置"

当我发现64位Java运行时安装没有覆盖32位版本的注册表项。 如果您使用32位版本的regedit.exe,则会发现属于32位Java运行时环境安装的注册表项。

所以下面的批处理文件应该解决上述问题:

 ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: @ECHO OFF :: Execution on a 64 BIT system? if defined PROGRAMFILES(x86) (set "REGEDITLOC=%windir%\SysWOW64\") else set "REGEDITLOC=" :: Define local parameters set "TEMP_FILE_JAVA_REGISTRY_CONTENT=%~dp0java_runtime_environment.reg" :: Export java Runtime Keys from registry to a temporary file START /W %REGEDITLOC%REGEDIT /E "%TEMP_FILE_JAVA_REGISTRY_CONTENT%" "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment" :: Determine the install directory of java FOR /F "tokens=1* delims==" %%A IN ('TYPE "%TEMP_FILE_JAVA_REGISTRY_CONTENT%" ^| FIND "JavaHome"') DO SET JAVA_RUNTIME_HOME=%%B :: Remove not required chars SET JAVA_RUNTIME_HOME=%JAVA_RUNTIME_HOME:"=% SET JAVA_RUNTIME_HOME=%JAVA_RUNTIME_HOME:\\=\% @echo %JAVA_RUNTIME_HOME% :: Delete temp file @del "%TEMP_FILE_JAVA_REGISTRY_CONTENT%" /S /Q > NUL 2>&1 @ECHO ON ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 

来自rojo的贡献:

上面的脚本说明了正确的想法,但是导出一个.reg文件并且抓取它可能有点麻烦。 这里是一样的想法,但使用%windir%\syswow64\reg.exe query内联查询注册表值:

 @ECHO OFF setlocal if defined PROGRAMFILES(x86) (set "reg=%windir%\SysWOW64\reg") else set "reg=reg" set "branch=HKLM\Software\JavaSoft\Java Runtime Environment" for /f "tokens=3" %%v in ('%reg% query "%branch%" /v "CurrentVersion" ^| find "REG_SZ"') do ( for /f "tokens=2*" %%I in ('%reg% query "%branch%\%%v" /v "JavaHome" ^| find "REG_SZ"') do ( set "$JAVA=%%J" ) ) echo Location of java.exe: %$JAVA%\bin 

编辑: 弗兰克的解决方案是正确的。 看到我的除了他的答案。


以前的回答:如何从开始菜单快捷方式刮取位置? 除非用户手动将其删除,否则快捷方式应始终位于“所有用户”开始菜单→程序中,在近20年的桌面支持中,我不能说我见过这种情况。 快捷方式应始终指向Java的默认实例,即使安装了多个版本。 而安装程序没有选择让最终用户放弃创建开始菜单快捷方式。

无论如何, wmic path win32_shortcutfile可以读取快捷方式的目标。

如下所述,“开始”菜单的快捷方式可以指向Java的64位安装。 如果是这种情况,则返回搜索java.exe %PROGRAMFILES(x86)%

 @echo off setlocal set "lnk=%PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\Java\About Java.lnk" if defined PROGRAMFILES(x86) (set "PF=%PROGRAMFILES(x86)%") else set "PF=%PROGRAMFILES%" for /f "tokens=1* delims==" %%I in ( 'wmic path win32_shortcutfile where "name='%lnk:\=\\%'" get target /format:list 2^>NUL ^| find "="' ) do set "$JAVA=%%~dpJ" if not defined $JAVA goto notfound 2>&1 "%$JAVA%\java.exe" -version | find /i "64-bit" >NUL && ( ( for /f "delims=" %%I in ('dir /s /b /o:n "%PF%\*java.exe" 2^>NUL') do set "$JAVA=%%~dpI" ) || ( goto notfound ) ) echo Latest 32-bit Java lives in %$JAVA% goto :EOF :notfound echo Please install 32-bit Java. goto :EOF