【问题标题】:How to get Java Version from batch script?如何从批处理脚本中获取 Java 版本?
【发布时间】:2011-08-06 05:40:49
【问题描述】:

我正在尝试从下面给出的 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不太熟悉。

【问题讨论】:

    标签: java batch-file


    【解决方案1】:

    我对@9​​87654321@ 进行了一些修改,使其适用于 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
    

    【讨论】:

      【解决方案2】:
      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 并且不使用 GOTO,这也会减慢脚本)。一些JDK厂商不支持-fullversion开关或者他们的实现与Oracle提供的这个不一样(最好避免它们)。

      【讨论】:

        【解决方案3】:
        @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 循环体中,我们设置了一个新的变量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
        

        【讨论】:

        • 谢谢帕特里克,这真是太酷了。希望有一天我会写自己的,但是 /f 的这对我来说很混乱:(
        • 关于上述问题,我还需要问一件事。如果我的 JAVA_HOME 路径设置为“c:\或批处理文件。”我该如何克服这个问题?
        • @Abhishek,尝试在%JAVA_HOME% 周围加上双引号,如下所示:"%JAVA_HOME%"
        • @Patrick Cuff 如果代码中的 java 可执行文件(第 4 行)派生自变量怎么办:for /f "tokens=3" %%g in ('%JAVA_HOME% -version 2^>^&1 ^| findstr /i "version"') - 在这种情况下,我该如何指定引号?仅在 JAVA_HOME 周围使用引号似乎不起作用!
        • @Neel 尝试将 %JAVA_HOME%(只是 bin 目录)添加到 PATH 的前面(您已指定 setlocal,因此它仅对 bat 文件的范围有效)。 SET PATH=%JAVA_HOME%\bin;%PATH%'for /f "tokens=3" %%g in ('java -version 2^>^&1 ^| findstr /i "version"')
        【解决方案4】:

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

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

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

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

        【讨论】:

        • 嘿,谢谢欧文。 awk 在 Windows 上不起作用,我在 linux 中使用相同,但你的似乎更好,这里是我的 java -version 2>&1 |头-1 | awk '{打印 $NF}' |切-d'。 -f2
        • 啊,我的错。抱歉,我没有仔细阅读以发现它是 Windows。
        • 没关系,看来我需要 15 声望才能投票。我是这个网站的新手,当我在这个网站上有足够的声誉时会这样做。再次感谢!
        • 把它留给回答了你实际提出的问题的 Patrick :)
        • 在 Windows 上,您也可以使用 PowerShell 执行类似操作:$a = [regex]::matches((java -version 2>&1),"[0-9]\.[0-9]\.[0-9]_[0-9]{2}")[1].value; $a.split(".")。您可以通过索引访问版本组件; [0] = 主要,[1] = 次要,[2] = 构建。
        猜你喜欢
        • 2018-11-12
        • 2013-07-16
        • 2021-09-09
        • 2011-06-15
        • 2020-03-20
        • 1970-01-01
        • 2013-07-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多