如何在Windows命令提示符中使用单个命令获取Java版本?

4

我需要从下面的 java -version 输出中获取 Java 版本 1.6.0_26

java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) Client VM (build 20.1-b02, mixed mode, sharing)

请帮助我获取 1.6.0_26 注意:我不需要PowerShell或任何外部程序
更新:
我想到了 java -version 2>&1 | findstr /i "version",它给我以下输出
java version "1.6.0_22"

现在即使是Java中的模式匹配正则表达式对我来说也可以工作 :)


描述您的最终目标是什么?也许有更好的方法。这不是与https://dev59.com/72035IYBdhLWcg3wBLJL相同的问题吗? - Aravind Yarram
@Pangea:链接使用批处理文件获取Java版本,我需要通过一行命令直接获取Java版本“1.6.0_26”,因为我无法在客户机上部署我的批处理文件。 - AabinGunz
为什么不在代码中调用java.version属性,直接使用它或将其写入文件的新空白行?否则,我真的看不出Java(作为一种编程语言)与此有什么关系。 - Andrew Thompson
6个回答

4
您可以在一行中运行Pangea链接问题的解决方案:
c:\>for /f "tokens=3" %g in ('java -version 2^>^&1 ^| findstr /i "version"') do @echo %g
"1.6.0_24"
c:\>for /f "tokens=3" %g in ('java -version 2^>^&1 ^| findstr /i "version"') do ( @set v=%g & @echo %v:~1,8% )
1.6.0_24
我刚刚检查了一下,似乎我的第二个示例只适用于Windows7,在Windows XP上以下内容适用于我(因此它也应该适用于Windows7):
for /f "tokens=3" %g in ('java -version 2^>^&1 ^| findstr /i "version"') do ( @echo %~g )

我知道这样要求太多了,但是还是不能去掉 " 吗? - AabinGunz
请查看我的编辑。但是这假设响应具有一定的长度,可能并不总是有效。 - user330315
嗯,对我来说可以运行。你启用了“命令扩展”吗?它们默认是启用的,这就是使%v:~1,8%语法生效的原因。 - user330315
我不知道你刚才说的是什么:P 你所说的“命令扩展”是什么意思?另外,我需要使用默认设置。 - AabinGunz
@AbhishekSimon:看一下我的编辑。似乎第一个语法只在Windows7下起作用。 - user330315

3
你可以通过命令提示符中的单行命令完成此操作。 C:>java -version

2

您可以尝试以下方法:

java -version 2>&1 | awk '/version/ {print $3}' | egrep -o '[^\"]*'

之前没注意到这个问题。 - Kris
1
你可能想要删除你的回答,因为人们可能会给你点踩。 - AabinGunz
实际上,这个答案使用Windows版UNIX工具是完全有效的。 - Barend

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

这将把Java版本存储到jver变量中,并且作为整数进行比较。例如,您可以使用它进行比较。
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,也不使用可能会减慢脚本的GOTO)。一些JDK供应商不支持-fullversion开关,或者他们的实现与Oracle提供的实现不同(最好避免使用它们)。

0
我编写了以下函数来获取Java版本1.6.0_26
String regexMatch(String myInput, String myRegex)
{
String ResultString
Pattern regex
Matcher regexMatcher

regex = Pattern.compile(myRegex, Pattern.DOTALL);

regexMatcher = regex.matcher(myInput);

List<String> matchList = new ArrayList<String>();
while (regexMatcher.find()) {
    matchList.add(regexMatcher.group());
}

for(int i=0;i<matchList.size();i++)
{
    myInput=myInput.replaceAll( matchList[i], '')
}
return myInput;
}

并调用

rs=regexMatch(rs,"[a-zA-Z\"]+")

其中 rs="java version \"1.6.0_26\""


0

基于 @a_horse_with_no_name 的代码,但先检测命令是否存在。

where java > nul
if %ERRORLEVEL% neq 0 (
    set java_v="Command not found"
) else (
    for /f "tokens=3" %%g in ('java -version 2^>^&1 ^| findstr /i "version"') do set java_v=%%g
)
echo  Java: %java_v:~1,8%

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接