如何从批处理脚本获取Java版本?

时间:2011-04-15 10:34:35

标签: java batch-file

我试图从下面给出的java版本输出中获得'6'

java version "1.6.0_21"
Java(TM) SE Runtime Environment (build 1.6.0_21-b07)
Java HotSpot(TM) Client VM (build 17.0-b17, mixed mode, sharing)

对于我写的这个批处理脚本

set VERSION6="1.6.0_21"
java -version 2>&1 | findstr "version" >ab.txt
for /f "tokens=3" %%g in (ab.txt) do (
  if not %%g == %VERSION6% echo %%g
  echo %%g
)

%%g显示“1.6.0_21”

有人可以指导我改正方向吗?我对for /f并不熟悉。

4 个答案:

答案 0 :(得分:11)

@echo off
setlocal

set VERSION6="1.6.0_21"
for /f "tokens=3" %%g in ('java -version 2^>^&1 ^| findstr /i "version"') do (
    @echo Output: %%g
    set JAVAVER=%%g
)
set JAVAVER=%JAVAVER:"=%
@echo Output: %JAVAVER%

for /f "delims=. tokens=1-3" %%v in ("%JAVAVER%") do (
    @echo Major: %%v
    @echo Minor: %%w
    @echo Build: %%x
)

endlocal

在第一个for循环中,"tokens=3"表示我们将仅使用命令输出中的第三个标记。我们可以在java -version循环本身内运行此命令,而不是将for命令的输出重定向到文件。插入符号(^)是转义字符,因此我们可以在命令字符串中嵌入>&|符号。

for循环的主体内,我们设置了一个新的var JAVAVER,以便我们稍后可以对版本字符串进行一些操作。

set JAVAVER=%JAVAVER:"=%命令删除版本字符串周围的双引号。

最后一个for循环解析java版本字符串。 delims=.表示我们将使用句点划分令牌。 tokens=1-3说我们要将前三个标记从字符串传递给循环体。我们现在可以使用显式变量%%v和隐含变量(字母表中的下一个字母)%%w%%x来获取java版本字符串的组件。

当我在我的系统上运行时,我得到:

Output: "1.6.0_24" 
Output: 1.6.0_24
Major: 1 
Minor: 6 
Build: 0_24

答案 1 :(得分:1)

这将提取版本号的次要部分:

java -version 2>&1 | awk '/version/ {print $3}' | awk -F . '{print $2}'

但是,最好提取major.minor并匹配,以防Oracle再次更改版本号方案,例如:

java -version 2>&1 | awk '/version/ {print $3}' | egrep -o '[0-9]+\.[0-9]+'

答案 2 :(得分:1)

我对Patrick's answer进行了一些修改,因此适用于Java 9,10等。 这将返回1.x的次要版本,以及Java 9,10等的主要版本

@echo off
setlocal

rem We use the value the JAVACMD environment variable, if defined
rem and then try JAVA_HOME
set "_JAVACMD=%JAVACMD%"
if "%_JAVACMD"=="" (
  if not "%JAVA_HOME%"=="" (
    if exist "%JAVA_HOME%\bin\java.exe" set "_JAVACMD=%JAVA_HOME%\bin\java.exe"
  )
)
if "%_JAVACMD%"=="" set _JAVACMD=java

rem Parses x out of 1.x; for example 8 out of java version 1.8.0_xx
rem Otherwise, parses the major version; 9 out of java version 9-ea
set JAVA_VERSION=0
for /f "tokens=3" %%g in ('%_JAVACMD% -Xms32M -Xmx32M -version 2^>^&1 ^| findstr /i "version"') do (
  set JAVA_VERSION=%%g
)
set JAVA_VERSION=%JAVA_VERSION:"=%
for /f "delims=.-_ tokens=1-2" %%v in ("%JAVA_VERSION%") do (
  if /I "%%v" EQU "1" (
    set JAVA_VERSION=%%w
  ) else (
    set JAVA_VERSION=%%v
  )
)

@echo %JAVA_VERSION%

endlocal

答案 3 :(得分:0)

for /f tokens^=2-5^ delims^=.-_^" %j in ('java -fullversion 2^>^&1') do @set "jver=%j%k%l%m"

这会将java版本存储到 jver 变量中并作为整数存储 你可以用它进行比较.E.G

if %jver% LSS 16000 echo not supported version

。您可以通过删除%k和%l以及%m来使用更多主要版本。此命令提示符版本。

对于.bat,请使用:

@echo off
PATH %PATH%;%JAVA_HOME%\bin\
for /f tokens^=2-5^ delims^=.-_^" %%j in ('java -fullversion 2^>^&1') do set "jver=%%j%%k%%l%%m"

根据我的测试,这是从bat获取java版本的最快方法(因为它只使用内部命令而不是外部命令FINDFINDSTR并且不使用{{1}这也可以减慢脚本)。有些JDK供应商不支持GOTO交换机,或者它们的实现与Oracle提供的实现不同(更好的避免它们)。