Javaがインストールされているバッチファイルから発見しますか?
-
10-07-2019 - |
質問
バッチスクリプトからJAVA_HOME変数を設定したい
解決
このスニペットは、java.exeの現在のPATHを検索し、見つかった場所を出力します:
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%
)
他のヒント
BATファイルから現在のJavaバージョンを取得を参照して、現在のレジストリに保存されている情報に基づくJavaインストール。
このソリューションは、C:\ Program Files \ Java \ jdk1.6.0_18など、%ProgramFiles%\ JavaにインストールされているJDKに依存します。行を変更することができます" 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=
レジストリに保存されている値を使用して、Javaがインストールされている場所を自動的に検出し、JAVA_HOME変数を設定できます。
HKLM > Software > JavaSoft > Java Runtime Environment
この場所には、CurrentVersionというキーがあります。このバージョンは、このレベルのディレクトリの1つを名前で参照します。ディレクトリを開くと、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を自動検出するバッチファイルを作成するために必要なものを説明しています。
完璧ではありませんが、以下を使用して現在の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
JAVA_HOMEがまだ設定されていない場合、設定する場合は、おそらく次のようなことを行う必要があります
dir java.exe /B /S
ファイルjava.exeを含むすべてのディレクトリのリストが表示されます。そこから、その出力を別のコマンドにパイプして、結果を解析し、それらのディレクトリの1つを選択し、それを使用してJAVA_HOME変数を設定します。
Javaは、インストール時にJAVA_HOME変数を設定することになっています。これを使用して、Javaの場所を見つけます。
if not "%JAVA_HOME%" == "" goto HasJavaHome
:HasJavaHome
set JAVA_HOME=... // Your new value goes here.
これは、パス内のすべてのファイルで最初に出現するものを検索する便利な小さなバッチファイルです。魔法のような小さな部分は、forループの%%〜dp $ PATH:i %% iです。 %%〜dpは、次の変数をドライブ文字とパスのみに展開します。 $ PATH:iは、forループに渡されるファイル名である%% iの最初の出現をパスで検索します。
例: 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
これはハードドライブ全体を検索しません。親ディレクトリツリーのみを検索するため、" 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