如何确定32BIT Java的位置

时间:2015-03-10 10:33:07

标签: java windows batch-file 32-bit

有些日子以来,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安装。

2 个答案:

答案 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
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

来自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

答案 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