С некоторых дней 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 (через командную строку или файл конфигурации).
Как я узнал, 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
Изменить: решение 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
InternetExplorer.Application
и использовать обнаружение браузера для определения последней 32-разрядной версии, но безопасность браузера не позволила бы мне запустить сценарий в экземпляре IE в сценарии на локальном хосте. Я думаю, что мое решение примерно так же близко, как вы получите, хотя я предполагаю, что это не волшебство, на которое вы надеялись.
Control Panel > Java
а затем перейдите на вкладкуJava
, оттуда вы сможете увидеть местоположение текущего jre, в моем случае этоC:\Program Files\Java\jre1.8.0_31\bin\javaw.exe