Узнайте из командного файла, где установлена ​​Java? - PullRequest
12 голосов
/ 12 марта 2009

Я хочу установить переменную JAVA_HOME из пакетного скрипта

Ответы [ 9 ]

10 голосов
/ 12 марта 2009

Этот фрагмент будет искать в текущем PATH файл java.exe и распечатывать, где он был найден:

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

В моей системе это дает мне

C: \ WINDOWS \ system32 \

Используя это, вы можете установить JAVA_HOME следующим образом:

@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%
)
7 голосов
/ 13 марта 2009

См. Получить текущую версию Java из файла BAT , чтобы получить текущую установку Java на основе информации, хранящейся в реестре.

6 голосов
/ 17 марта 2010

Это решение зависит от того, какой JDK установлен в папке% ProgramFiles% \ Java, например C: \ Program Files \ Java \ jdk1.6.0_18. Вы можете изменить строку «set JDK_Version = 1.6» на версию, которую вы хотите использовать, например «set JDK_Version = 1.5».

Предполагая, что последняя версия JDK будет в нижней части списка (jdk% jdk_Version% *), последняя доступная версия должна быть установлена ​​как JAVA_HOME. Если JDK не может быть найден, JAVA_HOME не будет изменен. Если JDK не может быть найден, а JAVA_HOME не имеет значения, сценарий отобразит сообщение об ошибке.

@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=
5 голосов
/ 19 июня 2009

Вы можете использовать значения, хранящиеся в реестре, для автоматического обнаружения места установки Java и настройки переменной JAVA_HOME.

HKLM > Software > JavaSoft > Java Runtime Environment

В этом месте находится ключ под названием CurrentVersion. Эта версия ссылается на один из каталогов на этом уровне по имени. Открытие каталога предоставляет другой ключ под названием JavaHome. Значение JavaHome - это путь к файловой системе, который можно использовать для определения переменной среды JAVA_HOME.

В пакетном файле вы можете сделать что-то вроде:

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

Если вы хотите узнать больше, я написал учебник , описывающий, что необходимо для создания пакетного файла для автоматического обнаружения JAVA_HOME.

2 голосов
/ 29 мая 2009

Хотя это и не идеально, вы можете использовать следующее для обнаружения текущей папки JRE:

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

Если вам нужен JDK, используйте:

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

Для более надежного решения, основанного на проверке реестра Windows, используйте:

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

Для JDK вам понадобится эта строка:

set KeyName=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit
1 голос
/ 12 марта 2009

Если JAVA_HOME еще не установлен, и вы хотите установить его, то вам, вероятно, нужно сделать что-то вроде

dir java.exe /B /S

, который выдаст вам список всех каталогов, содержащих файл java.exe. Оттуда вы можете передать этот вывод другой команде, которая анализирует результаты и выбирает один из этих каталогов, а затем использует его для установки переменной JAVA_HOME.

0 голосов
/ 20 октября 2011

Это не поиск по всему жесткому диску. Он только ищет родительское дерево каталогов и поэтому работает намного быстрее, чем "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
0 голосов
/ 04 июня 2009

Вот небольшой удобный пакетный файл, который будет искать все на вашем пути для первого вхождения файла. Волшебный маленький бит - это %% ~ dp $ PATH: i %% i в цикле for. %% ~ dp расширит следующую переменную только до буквы диска и пути. $ PATH: i ищет путь для первого вхождения %% i, который является именем файла, которое передается в цикл for.

пример: Где.бат

@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
0 голосов
/ 12 марта 2009

Java должна устанавливать переменную JAVA_HOME при ее установке. Используйте это, чтобы найти местоположение Java:

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

:HasJavaHome
set JAVA_HOME=... // Your new value goes here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...