Descubra a partir de um arquivo em lote onde o Java está instalado?
-
10-07-2019 - |
Pergunta
Eu quero definir a variável java_home de um script em lote
Solução
Este trecho pesquisará o caminho atual para java.exe e imprimirá onde foi encontrado:
for /f %%j in ("java.exe") do @echo.%%~dp$PATH:j
No meu sistema, isso me dá
C: Windows System32
Usando isso, você pode definir java_home da seguinte forma:
@echo off
for /f %%j in ("java.exe") do (
set JAVA_HOME=%%~dp$PATH:j
)
if %JAVA_HOME%.==. (
@echo java.exe not found
) else (
@echo JAVA_HOME = %JAVA_HOME%
)
Outras dicas
Ver Obtenha a versão Java atual de um arquivo de bat Para obter a instalação Java atual com base nos Infos armazenados no registro.
Esta solução depende do JDK instalado em %ProgramFiles % java, por exemplo C: Arquivos de Programas Java JDK1.6.0_18. Você pode alterar a linha "Definir jdk_version = 1.6" para a versão que deseja usar, como "set jdk_version = 1.5".
Supondo que a versão mais recente do JDK esteja na parte inferior da lista (JDK%jdk_version%*), a versão mais recente disponível deve ser definida como java_home. Se o JDK não puder ser encontrado, Java_Home não será alterado. Se o JDK não puder ser encontrado e Java_Home não tiver um valor, o script exibirá uma mensagem de erro.
@echo off
rem set the version of jdk you would like to use (1.4, 1.5, 1.6, etc)
set JDK_Version=1.6
echo.
echo Locating JDK %JDK_Version%
for /d %%i in ("%ProgramFiles%\Java\jdk%jdk_Version%*") do (set Located=%%i)
rem check if JDK was located
if "%Located%"=="" goto else
rem if JDK located display message to user
rem update %JAVA_HOME%
set JAVA_HOME=%Located%
echo Located JDK %jdk_Version%
echo JAVA_HOME has been set to:
echo %JAVA_HOME%
goto endif
:else
rem if JDK was not located
rem if %JAVA_HOME% has been defined then use the existing value
echo Could not locate JDK %JDK_Version%
if "%JAVA_HOME%"=="" goto NoExistingJavaHome
echo Existing value of JAVA_HOME will be used:
echo %JAVA_HOME%
goto endif
:NoExistingJavaHome
rem display message to the user that %JAVA_HOME% is not available
echo No Existing value of JAVA_HOME is available
goto endif
:endif
rem clear the variables used by this script
set JDK_Version=
set Located=
Você pode usar os valores armazenados no registro para descobrir automaticamente onde o Java está instalado e configurar a variável java_home.
HKLM > Software > JavaSoft > Java Runtime Environment
Neste local, é uma chave chamada CurrentVersion. Esta versão faz referência a um dos diretórios nesse nível pelo nome. A abertura do diretório expõe outra chave chamada Javahome. O valor de Javahome é um caminho do sistema de arquivos que pode ser usado para definir sua variável de ambiente Java_Home.
Dentro de um arquivo em lote, você pode fazer algo como:
FOR /F "skip=2 tokens=2*" %%A IN ('REG QUERY "HKLM\Software\JavaSoft\Java Runtime Environment" /v CurrentVersion') DO set CurVer=%%B
FOR /F "skip=2 tokens=2*" %%A IN ('REG QUERY "HKLM\Software\JavaSoft\Java Runtime Environment\%CurVer%" /v JavaHome') DO set JAVA_HOME=%%B
Se você quiser ler mais, eu escrevi um tutorial descrevendo o que é necessário para construir um arquivo em lote para descobrir automaticamente java_home.
Embora não seja perfeito, você pode usar o seguinte para descobrir a pasta JRE atual:
for /d %%i in ("\Program Files\Java\jre*") do set JAVA_HOME=%%i
Se for o JDK que você deseja, use:
for /d %%i in ("\Program Files\Java\jdk*") do set JAVA_HOME=%%i`
Para uma solução mais robusta com base na verificação do registro do Windows, use:
set KeyName=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment
set Cmd=reg query "%KeyName%" /s
for /f "tokens=2*" %%i in ('%Cmd% ^| find "JavaHome"') do set JAVA_HOME=%%j
Para o JDK, você precisará desta linha:
set KeyName=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit
Se Java_home já não está definido, e você deseja defini -lo, provavelmente precisa fazer algo como
dir java.exe /B /S
O que fornecerá uma lista de todos os diretórios que contêm o arquivo java.exe. A partir daí, você pode tubular a saída para outro comando que analisa os resultados e seleciona um desses diretórios e o usa para definir a variável java_home.
O Java deve configurar a variável java_home quando está instalada. Use isso para encontrar a localização do Java:
if not "%JAVA_HOME%" == "" goto HasJavaHome
:HasJavaHome
set JAVA_HOME=... // Your new value goes here.
Aqui está um pequeno arquivo em lote que pesquisará tudo no seu caminho para a primeira ocorrência de um arquivo. O pouquinho mágico é o%~ DP $ PATH: I %% I no loop for. %% ~ DP expandirá a próxima variável para a letra e o caminho da unidade. O $ PATH: eu procuro o caminho para a primeira ocorrência de %% I, que é o nome do arquivo que é passado para o loop for.
exemplo: Onde.bat
@echo off
setlocal
if "%1"=="" goto USAGE
set filename=%1
for %%i in (%filename%) do @echo %%~dp$PATH:i%%i
goto EOF
:USAGE
echo %0 filename
:EOF
endlocal
Isso não procura todo o disco rígido. Ele pesquisa apenas a árvore do diretório pai e, portanto, é muito mais rápido do que usar "dir java.exe /b /s".
@ECHO off
ECHO ------------------------------------------------------------------
ECHO Define the location of an existing JDK install by
ECHO searching for Javasoft JDK distrobution in parent
ECHO directories.
ECHO.
ECHO Script does not add trailing slash.
ECHO ------------------------------------------------------------------
IF DEFINED JAVA_HOME (
ECHO JAVA_HOME is already set.
GOTO :JHSET
)
SET matchobject=Javasoft\bin\java.exe
SET "dir=%~f0"
:LOOP
CALL :FGETDIR "%dir%"
IF EXIST "%dir%\%matchobject%" (
ECHO Found JAVA_HOME at %dir%\
GOTO :HOMESET
)
IF "%dir:~-1%" == ":" (
ECHO Reached root and directory containing "%matchobject%" not found.
GOTO :EOF
)
GOTO :LOOP
:HOMESET
SET JAVA_HOME=%dir%
GOTO :JHSET
:: function section
:FGETDIR
SET "dir=%~dp1"
SET "dir=%dir:~0,-1%"
EXIT /B 0
:: end function section
:JHSET
:: Does JAVA_HOME have a trailing slash? If so remove it.
IF !JAVA_HOME:~-1!==\ SET JAVA_HOME=!JAVA_HOME:~0,-1!
ECHO JAVA_HOME is %JAVA_HOME%
ECHO Will close in a few seconds...
ping -n 60 127.0.0.1>nul