如何从批处理脚本获取Java版本?
我试图从下面给出的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
。
@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"
表示我们将只使用命令输出中的第三个标记。 我们可以在for
循环中运行此命令,而不是将java -version
命令的输出重定向到文件。 插入符号( ^
)是转义字符,是必需的,因此我们可以嵌入>
, &
和|
命令字符串中的符号。
在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
这将提取版本号的次要部分:
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]+'
for /f tokens^=2-5^ delims^=.-_^" %j in ('java -fullversion 2^>^&1') do @set "jver=%j%k%l%m"
这会将java版本存储到jver
变量和整数中并且您可以将它用于比较.EG
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版本的最快方法(因为它只使用内部命令而不使用外部命令作为FIND
, FINDSTR
并且不使用GOTO
,这也会减慢脚本速度)。 有些JDK供应商不支持-fullversion
交换机,或者它们的实现与Oracle提供的实现不同(更好的避免它们)。
我对Patrick的答案进行了一些修改,因此它适用于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