Chcę ustawić zmienną JAVA_HOME ze skryptu wsadowegoOdkryj z pliku wsadowego, gdzie zainstalowana jest Java?
Odpowiedz
Ten fragment wyszuka bieżącą ścieżkę dla java.exe i wydrukować gdzie stwierdzono:
for /f %%j in ("java.exe") do @echo.%%~dp$PATH:j
W moim systemie to daje mi
C: \ WINDOWS \ system32 \
Stosując tę można ustawić JAVA_HOME następująco:
@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%
)
system32 nie jest tam, gdzie JRE zostanie zainstalowany. Zobacz http://mindprod.com/jgloss/registry.html#JAVAFIND JAVA_HOME jest zazwyczaj używany w skryptach w tym formularzu do uruchamiania aplikacji:% JAVA_HOME% \ bin \ java – McDowell
Nie mówię, że tak, ale to tam się dzieje przebywać na mojej ścieżce. Z innej odpowiedzi (lub komentarzy do innej odpowiedzi, nie wiem, została usunięta) możesz * może * mieć instalator, który kopiuje plik java.exe do katalogu% systemroot% \ system32. W moim systemie najwyraźniej tak. –
Moje rozwiązanie znajdzie miejsce, w którym java.exe znajduje się na * twojej * ścieżce, jeśli w ogóle. –
Java ma ustawić zmienną JAVA_HOME, gdy jest zainstalowana. Użyj tego, aby znaleźć lokalizację Java:
if not "%JAVA_HOME%" == "" goto HasJavaHome
:HasJavaHome
set JAVA_HOME=... // Your new value goes here.
Chcę "odkryć", gdzie jest java. – flybywire
Java nigdy nie ustawił zmiennej JAVA_HOME po zainstalowaniu. Jest to konwencja używana, aby umożliwić programowi zapisującemu skryptowi zezwolenie użytkownikowi systemu na określenie konkretnej wersji języka Java, która będzie używana podczas uruchamiania aplikacji, ponieważ może być zainstalowana więcej niż jedna wersja. – McDowell
Jeśli JAVA_HOME nie jest już ustawiony, a chcesz go ustawić, to prawdopodobnie trzeba zrobić coś jak
dir java.exe /B /S
który daje lista wszystkich katalogów zawierających plik java.exe. Stamtąd możesz wyprowadzić to wyjście do innego polecenia, które analizuje wyniki i wybiera jeden z tych katalogów, a następnie używa go do ustawienia zmiennej JAVA_HOME.
To działa tylko z katalogu, w którym jest zainstalowany Java lub z dowolnego jego katalogu. Nie zadziała, na przykład jeśli uruchomi się z C: \, podczas gdy java jest zainstalowana gdzieś na D: \ – eleven81
Zobacz Get the current Java version from a BAT file, aby uzyskać bieżącą instalację w języku Java na podstawie informacji przechowywanych w rejestrze.
Chociaż nie jest idealny, można użyć następujących odkryć bieżący folder JRE:
for /d %%i in ("\Program Files\Java\jre*") do set JAVA_HOME=%%i
Jeśli to JDK chcesz, zastosowanie:
for /d %%i in ("\Program Files\Java\jdk*") do set JAVA_HOME=%%i`
Dla bardziej solidnego rozwiązania opartego na sprawdzenie rejestru Windows, użyj:
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
Dla JDK potrzebujesz tej linii:
set KeyName=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit
Oto poręczny mały plik wsadowy, który przeszuka wszystko na twojej ścieżce pod kątem pierwszego wystąpienia pliku. Magiczny kawałek to %% ~ dp $ PATH: i %% i w pętli for. %% ~ dp rozwinie następną zmienną tylko do litery dysku i ścieżki. $ PATH: szukam ścieżki dla pierwszego wystąpienia %% i, która jest nazwą pliku przekazywaną do pętli for.
przykład: 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
Można użyć wartości przechowywanych w rejestrze, aby automatycznie wykryć, gdzie jest zainstalowany i konfiguracja Java zmienną JAVA_HOME.
HKLM > Software > JavaSoft > Java Runtime Environment
W tym miejscu jest klucz o nazwie CurrentVersion. Ta wersja odwołuje się do jednego z katalogów na tym poziomie po nazwie. Otwieranie katalogu udostępnia inny klucz o nazwie JavaHome. Wartość JavaHome jest ścieżką systemu plików, która może być użyta do zdefiniowania zmiennej środowiskowej JAVA_HOME.
w pliku wsadowym można zrobić coś takiego:
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
Jeśli chcesz dowiedzieć się więcej, mam napisane tutorial opisując, co jest potrzebne do skonstruowania plik wsadowy do auto-odkryć JAVA_HOME.
To rozwiązanie zależy od zainstalowanego JDK w% ProgramFiles% \ Java, na przykład C: \ Program Files \ Java \ jdk1.6.0_18. Możesz zmienić linię "ustaw JDK_Version = 1.6" na wersję, której chcesz użyć, taką jak "ustaw JDK_Version = 1.5".
Zakładając, że najnowsza wersja JDK znajduje się u dołu listy (jdk% jdk_Version% *), najnowsza dostępna wersja powinna zostać ustawiona jako JAVA_HOME. Jeśli nie można znaleźć JDK, JAVA_HOME nie zostanie zmieniony. Jeśli nie można znaleźć JDK, a JAVA_HOME nie ma wartości, skrypt wyświetli komunikat o błędzie.
@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=
Nie przeszukuje całego dysku twardego. Przeszukuje tylko drzewo katalogów nadrzędnych, a więc jest znacznie szybsze niż przy użyciu "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
Twój tytuł i twoje pytanie są przeciwieństwami. Co to jest, dostać lub ustawić? –