12

我想从批处理脚本中设置 JAVA_HOME 变量

4

9 回答 9

11

此代码段将在当前 PATH 中搜索 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%
)
于 2009-03-12T15:59:37.060 回答
7

请参阅从 BAT 文件获取当前 Java 版本,以根据注册表中存储的信息获取当前 Java 安装。

于 2009-03-12T21:39:10.973 回答
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=
于 2010-03-17T19:03:30.363 回答
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

如果您想了解更多信息,我已经编写了一个教程,描述了构建批处理文件以自动发现 JAVA_HOME 所需的内容。

于 2009-06-18T21:18:08.993 回答
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
于 2009-05-29T00:33:10.393 回答
1

如果 JAVA_HOME 尚未设置,并且您想设置它,那么您可能需要执行类似的操作

dir java.exe /B /S

这将为您提供包含文件 java.exe 的所有目录的列表。从那里,您可以将该输出通过管道传输到另一个命令,该命令解析结果并选择其中一个目录,然后使用它来设置 JAVA_HOME 变量。

于 2009-03-12T12:15:07.220 回答
0

Java 应该在安装时设置 JAVA_HOME 变量。使用它来查找 Java 的位置:

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

:HasJavaHome
set JAVA_HOME=... // Your new value goes here.
于 2009-03-12T12:07:39.640 回答
0

这是一个方便的小批处理文件,它将搜索路径中的所有内容以查找文件的第一次出现。神奇的一点是 for 循环中的 %%~dp$PATH:i%%i 。%%~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
于 2009-06-04T18:43:50.233 回答
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
于 2011-10-20T01:42:10.767 回答