Как определить местоположение 32BIT Java

1

С некоторых дней JRE устанавливается в каталог, специфичный для версии [1].

Поэтому я попытался написать сценарий DOS или VBS, чтобы определить местоположение последней установленной 32-разрядной версии JRE 8.

Но при проверке ключа реестра "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft" я заметил, что в нем содержится только информация о 64-битном Java Runtime.

Итак, любая идея, как определить местоположение последней установленной 32-разрядной Java-Runtime через DOS или vbs? Это также должно учитывать, что 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 является статической. Как и в предыдущих версиях, статическая установка JRE выполняется только в том случае, если пользователь передает команду STATIC = 1 (через командную строку или файл конфигурации).

  • 0
    Я думаю, что вы можете проверить свой текущий jre, открыв Control Panel > Java а затем перейдите на вкладку Java , оттуда вы сможете увидеть местоположение текущего jre, в моем случае это C:\Program Files\Java\jre1.8.0_31\bin\javaw.exe
  • 0
    Как я могу выполнить этот шаг через DOS Batch или VBS скрипт?
Показать ещё 1 комментарий
Теги:
batch-file
32-bit

2 ответа

2
Лучший ответ

Как я узнал, 64-разрядная установка Java Runtime не отменяет ключи реестра 32-разрядной версии. Если вы используете 32-разрядную версию regedit.exe, вы найдете ключи реестра, которые относятся к 32-разрядной установке Java Runtime Environment.

Поэтому следующий пакетный файл должен решить вышеупомянутую проблему:

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@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
    Спасибо, что поделились этим интересным способом чтения контента из реестра.
  • 0
    Мне нравится ваше решение и вклад Рохо!
1

Изменить: решение Frank является правильным. Смотрите мое дополнение к его ответу.


Предыдущий ответ: Как насчет соскабливания местоположения из ярлыка меню "Пуск"? Ярлык должен всегда находиться в меню "Все пользователи" → "Программы", если пользователь не удалит его вручную, что почти через два десятилетия поддержки рабочего стола я не могу сказать, что когда-либо видел. Ярлык должен всегда указывать на экземпляр Java по умолчанию, даже если установлено несколько версий. У установщика нет возможности для конечного пользователя отказаться от создания ярлыков меню "Пуск".

В любом случае, wmic path win32_shortcutfile может читать цель ярлыка.

Как отмечалось ниже, ярлыки меню "Пуск" могут указывать на 64-разрядную установку Java. Если это %PROGRAMFILES(x86)% вернитесь к поиску %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
  • 0
    Интересный подход. Но это не решает проблему с поиском местоположения последней 32-битной версии. Если экземпляром по умолчанию является 64-битная версия, вы не найдете 32-битную версию с помощью ярлыка.
  • 0
    Ну, я попробовал несколько других хаков без особого успеха. Я думал о проверке автоматического обновления, поскольку исторически только 32-разрядные версии выполняли автоматическое обновление. Но это больше не относится к последним 64-битным версиям Java 8. Я попытался создать сценарий COM-объекта InternetExplorer.Application и использовать обнаружение браузера для определения последней 32-разрядной версии, но безопасность браузера не позволила бы мне запустить сценарий в экземпляре IE в сценарии на локальном хосте. Я думаю, что мое решение примерно так же близко, как вы получите, хотя я предполагаю, что это не волшебство, на которое вы надеялись.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню