Como determinar a localização de 32BIT Java

desde alguns dias que o JRE está instalado num directório específico da versão [1].

Então eu tentei escrever um dos batch ou VBS script para determinar a localização do mais recente instalado JRE 8 32 bit.

mas ao verificar a chave do registo "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft" eu notei que isso contém apenas informações sobre o tempo de execução Java de 64 bits.

então, alguma ideia de como determinar a localização da última execução Java de 32 bits instalada através do DOS ou vbs? Presente deve também considerar que uma versão de 64 bits pode ser instalado em paralelo no sistema.

uma alternativa pode ser uma pesquisa de ficheiros na pasta C:\Program Files (x86)\Java. Mas o tempo de execução Java pode não estar instalado neste diretório.

[1] http://www.oracle.com/technetwork/java/javase/8u20-relnotes-2257729.html

Directório de instalação JRE A partir de JDK 8u20 release, o JRE será instalado em um diretório específico de versão. Por exemplo: C:\Program Ficheiros\Java\jre1. 8. 0_20

a denominação do directório específico da versão é intencional e não indica que a instalação JRE é estática. Tal como acontece com as versões anteriores, a instalação estática JRE é realizada apenas se a opção STATIC=1 for passada (via linha de comandos ou arquivo de configuração) pelo Usuário.

Author: Colonel Thirty Two, 2015-03-10

2 answers

Como eu descobri a instalação de 64 bits Java Runtime não substitui as chaves de registro da versão de 32 bits. Se você usar a versão de 32 bits do regedit.exe você encontrará as chaves de registro que pertencem à instalação de ambiente de execução Java de 32 bits.

Então o seguinte ficheiro em lote deve resolver o problema acima:

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

contribuição da rojo:

O script acima ilustra a idéia correta, mas exportando A.reg arquivar e raspá-lo pode ser um pouco complicado. Aqui está a mesma ideia, mas usando %windir%\syswow64\reg.exe query para consultar os valores do registo em linha:

@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
 2
Author: Frank, 2015-03-11 15:59:50

Editar: a solução do Frank é a correcta. Veja a minha adição à resposta dele.


Resposta anterior: Que tal raspar a localização do atalho do menu Iniciar? O atalho deve estar sempre no Menu Iniciar Todos os usuários → programas a menos que um usuário remova manualmente, o que em quase duas décadas de suporte desktop eu não posso dizer que eu já vi acontecer. O atalho deve sempre apontar para a instância padrão de Java, mesmo que existam vários versões instaladas. E o instalador não tem opção para o utilizador final renunciar à criação dos atalhos do menu Iniciar.

De qualquer forma ... , wmic path win32_shortcutfile pode ler o alvo de um atalho.

Como comentado abaixo, os atalhos do Menu Iniciar poderão apontar para a instalação de 64 bits do Java. Se for esse o caso, então volte a procurar %PROGRAMFILES(x86)% por 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
 1
Author: rojo, 2017-05-23 12:14:13