windows 从批处理文件中发现 Java 安装在哪里?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/638301/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Discover from a batch file where is Java installed?
提问by flybywire
I want to set the JAVA_HOME variable from a batch script
我想从批处理脚本中设置 JAVA_HOME 变量
采纳答案by Patrick Cuff
This snippet will search the current PATH for java.exe, and print out where it was found:
此代码段将在当前 PATH 中搜索 java.exe,并打印出找到它的位置:
for /f %%j in ("java.exe") do @echo.%%~dp$PATH:j
On my system this gives me
在我的系统上,这给了我
C:\WINDOWS\system32\
C:\WINDOWS\system32\
Using this you can set JAVA_HOME as follows:
使用它,您可以按如下方式设置 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%
)
回答by RealHowTo
See Get the current Java version from a BAT fileto get the current Java installation based on the infos stored in the registry.
请参阅从 BAT 文件获取当前 Java 版本以根据存储在注册表中的信息获取当前 Java 安装。
回答by mcdon
This solution depends on the JDK being installed under %ProgramFiles%\Java, for example C:\Program Files\Java\jdk1.6.0_18. You can change the line "set JDK_Version=1.6" to the version you want to use such as "set JDK_Version=1.5".
此解决方案取决于安装在 %ProgramFiles%\Java 下的 JDK,例如 C:\Program Files\Java\jdk1.6.0_18。您可以将“set JDK_Version=1.6”行更改为要使用的版本,例如“set JDK_Version=1.5”。
Assuming that the latest version of JDK would be at the bottom of the list (jdk%jdk_Version%*) the latest version available should be set as JAVA_HOME. If the JDK could not be found JAVA_HOME will not be changed. If the JDK could not be found and JAVA_HOME doesn't have a value the script will display an error message.
假设最新版本的 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=
回答by mcdon
You can use values stored in the registry to automatically discover where Java is installed and setup the JAVA_HOME variable.
您可以使用存储在注册表中的值来自动发现 Java 的安装位置并设置 JAVA_HOME 变量。
HKLM > Software > JavaSoft > Java Runtime Environment
At this location is a Key called CurrentVersion. This version references one of the directories at this level by name. Opening the directory exposes another key called JavaHome. The value of JavaHome is a file system path that can be used to define your environment variable JAVA_HOME.
在此位置有一个名为 CurrentVersion 的密钥。此版本按名称引用此级别的目录之一。打开该目录会暴露另一个名为 JavaHome 的键。JavaHome 的值是一个文件系统路径,可用于定义环境变量 JAVA_HOME。
Within a batch file you can do something like:
在批处理文件中,您可以执行以下操作:
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
If you want to read more, I've written a tutorialdescribing what is needed to construct a batch file to auto-discover JAVA_HOME.
如果您想阅读更多内容,我已经编写了一个教程,描述了构建批处理文件以自动发现 JAVA_HOME 所需的内容。
回答by mcdon
While not perfect, you can use the following to discover the current JRE folder:
虽然不完美,但您可以使用以下内容来发现当前的 JRE 文件夹:
for /d %%i in ("\Program Files\Java\jre*") do set JAVA_HOME=%%i
If it's the JDK you want, use:
如果它是您想要的 JDK,请使用:
for /d %%i in ("\Program Files\Java\jdk*") do set JAVA_HOME=%%i`
For a more robust solution based on checking the Windows Registry, use:
对于基于检查 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
For the JDK, you'll need this line instead:
对于 JDK,您将需要这一行:
set KeyName=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Development Kit
回答by Ian Kemp
If JAVA_HOME isn't already set, and you want to set it, then you probably need to do something like
如果 JAVA_HOME 尚未设置,而您想设置它,那么您可能需要执行以下操作
dir java.exe /B /S
which will give you a list of all directories containing the file java.exe. From there you can pipe that output to another command that parses the results and selects one of those directories, then uses it to set the JAVA_HOME variable.
这将为您提供包含文件 java.exe 的所有目录的列表。从那里您可以将该输出通过管道传输到另一个命令,该命令解析结果并选择其中一个目录,然后使用它来设置 JAVA_HOME 变量。
回答by John Feminella
Java's supposed to set up the JAVA_HOME variable when it's installed. Use this to find the location of Java:
Java 应该在安装时设置 JAVA_HOME 变量。使用它来查找 Java 的位置:
if not "%JAVA_HOME%" == "" goto HasJavaHome
:HasJavaHome
set JAVA_HOME=... // Your new value goes here.
回答by Jeremy E
Here is a handy little batch file that will search everything in your path for the first occurance of a file. The magical little bit is the %%~dp$PATH:i%%i in the for loop. %%~dp will expand the next variable to the drive letter and path only. The $PATH:i searches the path for the first occurance of %%i which is the filename that is passed into the for loop.
这是一个方便的小批处理文件,它将搜索路径中的所有内容以查找文件的第一次出现。神奇的一点是 for 循环中的 %%~dp$PATH:i%%i 。%%~dp 将仅将下一个变量扩展为驱动器号和路径。$PATH:i 搜索 %%i 第一次出现的路径,这是传递到 for 循环的文件名。
example: Where.bat
示例: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
回答by djangofan
This doesn't search the entire hard drive. It only searches the parent directory tree and so its much faster than using "dir java.exe /B /S".
这不会搜索整个硬盘驱动器。它只搜索父目录树,因此比使用“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