繁体   English   中英

如何确定32BIT Java的位置

[英]How to determine location of 32BIT Java

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

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

所以下面的Batch文件应该可以解决上面的问题:

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@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

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


上一个答案:如何从开始菜单快捷方式抓取位置? 除非用户手动删除快捷方式,否则快捷方式应始终位于“所有用户”的“开始”菜单→“程序”中,在近二十年的桌面支持中,我不能说我曾经见过这种情况。 即使安装了多个版本,快捷方式也应始终指向Java的默认实例。 并且安装程序没有选项让最终用户放弃创建开始菜单快捷方式。

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

如下所述,“开始”菜单快捷方式可能指向64位Java安装。 如果是这种情况,那么回到搜索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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM