Scopri da un file batch dove è installato Java?
-
10-07-2019 - |
Domanda
Voglio impostare la variabile JAVA_HOME da uno script batch
Soluzione
Questo frammento cercherà l'attuale PATH per java.exe e stamperà dove è stato trovato:
for /f %%j in ("java.exe") do @echo.%%~dp$PATH:j
Sul mio sistema questo mi dà
C: \ WINDOWS \ system32 \
Usando questo puoi impostare JAVA_HOME come segue:
@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%
)
Altri suggerimenti
Vedi Ottieni la versione Java corrente da un file BAT per ottenere l'attuale Installazione Java basata sulle informazioni memorizzate nel registro.
Questa soluzione dipende dall'installazione di JDK in% ProgramFiles% \ Java, ad esempio C: \ Programmi \ Java \ jdk1.6.0_18. Puoi modificare la riga " set JDK_Version = 1.6 " alla versione che desideri utilizzare come " set JDK_Version = 1.5 " ;.
Supponendo che l'ultima versione di JDK sia in fondo all'elenco (jdk% jdk_Version% *) l'ultima versione disponibile dovrebbe essere impostata come JAVA_HOME. Se non è stato possibile trovare il JDK, JAVA_HOME non verrà modificato. Se non è possibile trovare JDK e JAVA_HOME non ha un valore, lo script visualizzerà un messaggio di errore.
@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=
È possibile utilizzare i valori memorizzati nel registro per scoprire automaticamente dove è installato Java e impostare la variabile JAVA_HOME.
HKLM > Software > JavaSoft > Java Runtime Environment
In questa posizione è presente una chiave denominata CurrentVersion. Questa versione fa riferimento a una delle directory a questo livello per nome. L'apertura della directory espone un'altra chiave chiamata JavaHome. Il valore di JavaHome è un percorso del file system che può essere utilizzato per definire la variabile di ambiente JAVA_HOME.
All'interno di un file batch puoi fare qualcosa del tipo:
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 vuoi leggere di più, ho scritto un tutorial che descrive ciò che è necessario per costruire un file batch per scoprire automaticamente JAVA_HOME.
Sebbene non sia perfetto, puoi utilizzare quanto segue per scoprire la cartella JRE corrente:
for /d %%i in ("\Program Files\Java\jre*") do set JAVA_HOME=%%i
Se è il JDK desiderato, utilizzare:
for /d %%i in ("\Program Files\Java\jdk*") do set JAVA_HOME=%%i`
Per una soluzione più solida basata sul controllo del registro di Windows, utilizzare:
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
Per JDK, invece, avrai bisogno di questa riga:
set KeyName=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit
Se JAVA_HOME non è già impostato e desideri impostarlo, probabilmente dovrai fare qualcosa del genere
dir java.exe /B /S
che ti darà un elenco di tutte le directory che contengono il file java.exe. Da lì puoi reindirizzare l'output a un altro comando che analizza i risultati e seleziona una di quelle directory, quindi lo utilizza per impostare la variabile JAVA_HOME.
Java dovrebbe impostare la variabile JAVA_HOME al momento dell'installazione. Usa questo per trovare la posizione di Java:
if not "%JAVA_HOME%" == "" goto HasJavaHome
:HasJavaHome
set JAVA_HOME=... // Your new value goes here.
Ecco un piccolo file batch utile che cercherà per la prima volta un file in tutto il percorso. Il piccolo bit magico è %% ~ dp $ PATH: i %% i nel ciclo for. %% ~ dp espande la variabile successiva solo alla lettera e al percorso dell'unità. $ PATH: cerco il percorso per la prima occorrenza di %% i che è il nome del file che viene passato nel ciclo for.
esempio: 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
Questo non cerca l'intero disco rigido. Cerca solo nella struttura di directory principale ed è quindi molto più veloce dell'uso di " 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