No script em lote como percorrer as sub chaves do Registro

1

No Registro do Windows, posso obter a lista de versões do Java que estão instaladas no meu sistema usando o código abaixo. Mas como percorrer a lista e armazenar o Java home em um array?

@ECHO OFF
REG QUERY "HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Development Kit" /S
PAUSE

Saída da seguinte forma:

output
-----------
D:\ITM\configuration 
experience\apm_datacollectors_win_8.1.4.0\j2se_datacollecto
r_win_8.1.4.0\j2sedc\.gdc.3.0.5.0\bin>config.bat

HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Development Kit
CurrentVersion    REG_SZ    1.8

HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Development Kit.7
JavaHome    REG_SZ    C:\Program Files\jdk1.7.0_79
MicroVersion    REG_SZ    0

HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Development Kit.7.0_79
JavaHome    REG_SZ    C:\Program Files\jdk1.7.0_79
MicroVersion    REG_SZ    0

HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Development Kit.8
JavaHome    REG_SZ    C:\Program Files\Java\jdk1.8.0_121
MicroVersion    REG_SZ    0

HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Development Kit.8.0_121
JavaHome    REG_SZ    C:\Program Files\Java\jdk1.8.0_121
MicroVersion    REG_SZ    0

HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Development Kit.8.0_121\MSI
INSTALLDIR    REG_SZ    C:\Program Files\Java\jdk1.8.0_121\
NOSTARTMENU    REG_SZ    0

Press any key to continue . . .
    
por Amit 23.05.2017 / 16:52

2 respostas

1

Não existe uma matriz no MS-DOS, mas você pode percorrer os resultados e obter os valores para o JavaHome da seguinte forma:

for /f "tokens=3* usebackq" %%a in ('reg query "HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Development Kit" /S ^| find "JavaHome"') do (
    echo %%a %%b
)
    
por 23.05.2017 / 17:04
0

Primeiro, obrigado pela resposta e por me fazer (um desenvolvedor java) ciente de que as matrizes não são suportadas no script em lote: -)

O que eu quero realizar? - > Eu estou trabalhando em um agente de monitoramento, seu atualmente fornecido aos clientes na forma de um arquivo zip. O cliente descompacta e executa um arquivo config.bat para configurar o agente em sua máquina. Este config.bat solicita ao usuário que insira JAVA_HOME (diretório onde o java está instalado na máquina do cliente), já que o agente é baseado em java. Minha tarefa é melhorar essa experiência do cliente procurando automaticamente por qualquer java instalado em sua máquina e não pedir ao cliente que insira realmente JAVA_HOME.

Agora, um caso de uso é que há apenas uma versão do Java instalada na máquina do cliente. Em seguida, o script config.bat deve ler essa entrada do java do registro do Windows. Mas e se houver várias instâncias do java instalado na máquina do cliente? Nesse caso, terei que mostrar ao cliente que ele tem várias instâncias de java em sua máquina e ele pode escolher uma delas para a instalação do agente.

@Berend: Obrigado, o loop for que você compartilhou acima funciona bem e retorna o resultado como abaixo. Em que loop %% a é a variável que armazena o valor após a iteração? Meu entendimento é correto e, em seguida, o que é %% b?

D:\ITM\configuration 
experience\apm_datacollectors_win_8.1.4.0\j2se_datacollecto
r_win_8.1.4.0\j2sedc\.gdc.3.0.5.0\bin>config.bat
C:\Program Files\jdk1.7.0_79
C:\Program Files\jdk1.7.0_79
C:\Program Files\Java\jdk1.8.0_121
C:\Program Files\Java\jdk1.8.0_121
    
por 24.05.2017 / 11:40