我想从批处理脚本
设置JAVA_HOME变量答案 0 :(得分:10)
此代码段将搜索当前PATH以查找java.exe,并打印出找到它的位置:
for /f %%j in ("java.exe") do @echo.%%~dp$PATH:j
在我的系统上,这给了我
C:\窗口\ 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%
)
答案 1 :(得分:7)
请参阅Get the current Java version from a BAT file以根据存储在注册表中的信息获取当前的Java安装。
答案 2 :(得分:6)
此解决方案取决于在%ProgramFiles%\ Java下安装的JDK,例如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=
答案 3 :(得分:5)
您可以使用存储在注册表中的值自动发现Java的安装位置并设置JAVA_HOME变量。
HKLM > Software > JavaSoft > Java Runtime Environment
在这个位置是一个叫做CurrentVersion的Key。此版本按名称引用此级别的其中一个目录。打开目录会公开另一个名为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所需的内容。
答案 4 :(得分:2)
虽然不完美,但您可以使用以下内容来发现当前的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
答案 5 :(得分:1)
如果尚未设置JAVA_HOME,并且您想设置它,那么您可能需要执行类似
的操作dir java.exe /B /S
将为您提供包含文件java.exe的所有目录的列表。从那里,您可以将该输出传递给另一个命令,该命令解析结果并选择其中一个目录,然后使用它来设置JAVA_HOME变量。
答案 6 :(得分:0)
Java应该在安装时设置JAVA_HOME变量。使用它来查找Java的位置:
if not "%JAVA_HOME%" == "" goto HasJavaHome
:HasJavaHome
set JAVA_HOME=... // Your new value goes here.
答案 7 :(得分:0)
这是一个方便的小批处理文件,它将搜索路径中第一次出现文件的所有内容。神奇的一点是%% ~dp $ PATH:i %% i在for循环中。 %% ~dp会将下一个变量扩展为驱动器号和路径。 $ PATH:我在路径中搜索%% 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
答案 8 :(得分: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