2011-04-15 34 views
10

我想获得 '6' 如下如何从批处理脚本获取Java版本?

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) 

给出了相同的Java版本输出我写这个批处理脚本

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不太了解。

回答

9
@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循环体内,我们设置了一个新的变量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 
+0

感谢帕特里克,这真的很酷的东西。希望我有一天会写我自己的,但是这对于/ f对我来说是相当困惑的:( – abi1964 2011-04-15 12:08:50

+0

还有一件事我需要问与上述问题有关。如果我的JAVA_HOME路径设置为“c:\ Program Files \ ....“,当我运行该脚本时,它会得到一个空格,并说”'C:\ Program'不能识别为内部或外部命令,可操作程序或批处理文件。“我该如何解决这个问题? – abi1964 2011-04-19 09:55:05

+1

@Abhishek,尝试在'%JAVA_HOME%'周围放置双引号,就像这样:'“%JAVA_HOME%”'。 – 2011-04-19 14:49:29

1

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

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

但是,它可能是更好的提取上,在案件甲骨文以后再例如更改版本号方案MAJOR.MINOR搭配:

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

嘿,谢谢欧文。 awk在windows上无法运行,我在linux中使用了相同的命令,但你的程序似乎更好,这里是我的java -version 2>&1 |头-1 | awk'{print $ NF}'|切“-d”。 -f2 – abi1964 2011-04-15 11:08:34

+0

啊,我的不好。对不起,我没有仔细阅读,发现它是Windows。 – 2011-04-15 11:12:00

+0

没关系,看来我需要15点声望才能投票。我是这个网站的新手,当我在这个网站上有足够的声望时会这样做。再次感谢! – abi1964 2011-04-15 11:16:50

0
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来使用更多主要版本。此命令提示版本。

对于。蝙蝠使用这样的:

@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" 

根据我的测试,这是摆脱蝙蝠的Java版本(因为它仅使用内部命令,而不是外部因素为FINDFINDSTR并且不使用GOTO最快的方法,其也可以减缓剧本)。一些JDK供应商不支持-fullversion交换机,或者它们的实现与Oracle提供的不一样(更好地避免它们)。