有些日子以来,JRE安装在特定于版本的目录[1]中。
所以我尝试编写DOS批处理或VBS脚本来确定最新安装的JRE 8 32位的位置。
但是在检查注册表项时 “HKEY_LOCAL_MACHINE \ SOFTWARE \ JavaSoft的” 我注意到这只包含有关64位Java运行时的信息。
那么任何想法如何通过DOS或vbs确定最新安装的32位Java运行时的位置?这也应该考虑在系统上并行安装64位版本。
替代方案可能是目录C:\ Program Files(x86)\ Java中的文件搜索。但是Java Runtime可能未安装在此目录中。
[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选项(通过命令行或配置文件)时才执行静态JRE安装。
答案 0 :(得分:2)
我发现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
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
贡献:
上面的脚本说明了正确的想法,但导出.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
答案 1 :(得分:1)
修改: Frank's solution是正确的。请参阅我的回答。
上一个回答:如何从开始菜单快捷方式抓取位置?快捷方式应始终位于“所有用户”开始菜单→“程序”中,除非用户手动将其删除,在近二十年的桌面支持中,我无法说出我曾见过的事情。即使安装了多个版本,快捷方式也应始终指向Java的默认实例。并且安装程序无法让最终用户放弃创建开始菜单快捷方式。
无论如何,wmic path win32_shortcutfile
可以读取快捷方式的目标。
如下所述,“开始”菜单快捷方式可能指向64位Java安装。如果是这种情况,那么请回到%PROGRAMFILES(x86)%
搜索java.exe
。
@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