2009-03-12 2 views

ответ

9

Этот фрагмент кода будет искать пути тока для 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% 
) 
+0

system32 не там, где будет установлена ​​JRE. См. Http://mindprod.com/jgloss/registry.html#JAVAFIND JAVA_HOME обычно используется в сценариях этой формы для запуска приложений:% JAVA_HOME% \ bin \ java – McDowell

+0

Я не говорю, что это так, но вот где это происходит жить на моем пути. Из другого ответа (или комментариев к другому ответу, я не знаю, он был удален) вы можете * установить установщик, который копирует java.exe в каталог% systemroot% \ system32. В моей системе, по-видимому, есть. –

+0

Мое решение найдет, где java.exe находится на * вашем * пути, если вообще. –

0

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

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

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

Я хочу «открыть», где находится Java. – flybywire

+1

Java никогда не устанавливал переменную JAVA_HOME при установке. Это соглашение, используемое для того, чтобы позволить сценаристу разрешить системному пользователю указывать конкретную версию Java для использования при запуске приложения, поскольку может быть установлена ​​более одной версии. – McDowell

0

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

dir java.exe /B /S 

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

+2

Это будет работать только из каталога, в котором установлена ​​java, или из любого его суперкаталога. Это не сработает, например, при запуске из C: \, в то время как java установлен где-то на D: \ – eleven81

1

Пока не совершенен, вы можете использовать следующие чтобы открыть текущую папку 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 
0

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

пример: 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 
4

Вы можете использовать значение, хранящееся в реестре для автоматического обнаружения, где установлен и настройка 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 

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

5

Это решение зависит от того, установлен ли JDK в% ProgramFiles% \ Java, например C: \ Program Files \ Java \ jdk1.6.0_18. Вы можете изменить строку «установить 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= 
0

Это не поиск всего жесткого диска. Он ищет только родительское дерево каталогов и, следовательно, намного быстрее, чем использование «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 
Смежные вопросы