Pregunta

Quiero establecer la variable JAVA_HOME desde un script por lotes

¿Fue útil?

Solución

Este fragmento buscará en la RUTA actual java.exe e imprimirá dónde se encontró:

for /f %%j in ("java.exe") do @echo.%%~dp$PATH:j

En mi sistema esto me da

  

C: \ WINDOWS \ system32 \

Utilizando esto, puede configurar JAVA_HOME de la siguiente manera:

@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%
)

Otros consejos

Consulte Obtenga la versión Java actual de un archivo BAT para obtener la versión actual Instalación de Java basada en la información almacenada en el registro.

Esta solución depende de la instalación de JDK en% ProgramFiles% \ Java, por ejemplo C: \ Program Files \ Java \ jdk1.6.0_18. Puede cambiar la línea " set JDK_Version = 1.6 " a la versión que desea usar, como " set JDK_Version = 1.5 " ;.

Suponiendo que la última versión de JDK estaría al final de la lista (jdk% jdk_Version% *), la última versión disponible debería establecerse como JAVA_HOME. Si no se puede encontrar el JDK, JAVA_HOME no se cambiará. Si no se pudo encontrar el JDK y JAVA_HOME no tiene un valor, el script mostrará un mensaje de error.

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

Puede usar valores almacenados en el registro para descubrir automáticamente dónde está instalado Java y configurar la variable JAVA_HOME.

HKLM > Software > JavaSoft > Java Runtime Environment

En esta ubicación hay una clave llamada CurrentVersion. Esta versión hace referencia a uno de los directorios en este nivel por su nombre. Abrir el directorio expone otra clave llamada JavaHome. El valor de JavaHome es una ruta del sistema de archivos que se puede utilizar para definir la variable de entorno JAVA_HOME.

Dentro de un archivo por lotes puede hacer 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

Si desea leer más, he escrito un tutorial que describe lo que se necesita para construir un archivo por lotes para descubrir automáticamente JAVA_HOME.

Aunque no es perfecto, puede usar lo siguiente para descubrir la carpeta JRE actual:

for /d %%i in ("\Program Files\Java\jre*") do set JAVA_HOME=%%i

Si es el JDK que desea, use:

for /d %%i in ("\Program Files\Java\jdk*") do set JAVA_HOME=%%i`

Para una solución más robusta basada en verificar el Registro de 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 el JDK, necesitará esta línea en su lugar:

set KeyName=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit

Si JAVA_HOME aún no está configurado y desea configurarlo, entonces probablemente deba hacer algo como

dir java.exe /B /S

que le dará una lista de todos los directorios que contienen el archivo java.exe. Desde allí puede canalizar esa salida a otro comando que analiza los resultados y selecciona uno de esos directorios, luego lo usa para establecer la variable JAVA_HOME.

Se supone que Java debe configurar la variable JAVA_HOME cuando está instalada. Use esto para encontrar la ubicación de Java:

if not "%JAVA_HOME%" == "" goto HasJavaHome

:HasJavaHome
set JAVA_HOME=... // Your new value goes here.

Aquí hay un pequeño y útil archivo por lotes que buscará todo en su ruta para la primera aparición de un archivo. El pedacito mágico es el %% ~ dp $ PATH: i %% i en el bucle for. %% ~ dp expandirá la siguiente variable solo a la letra de unidad y la ruta. $ PATH: i busca en la ruta la primera aparición de %% i, que es el nombre de archivo que se pasa al bucle for.

ejemplo: Where.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

Esto no busca en todo el disco duro. Solo busca en el árbol del directorio principal y es mucho más rápido 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top