代码之家  ›  专栏  ›  技术社区  ›  Sean McCallum

如何在批处理脚本子例程中获取Java版本?

  •  0
  • Sean McCallum  · 技术社区  · 6 年前

    从…起 this question :

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

    我如何将其放入子例程并调用它,传递到java可执行文件的路径?下面是我的问题的一个例子:

    @echo off
    setlocal enabledelayedexpansion
    
    call :GET_JAVA_VER "java"
    goto END
    
    :GET_JAVA_VER
        for /f "tokens=3" %%g in ('%1 -version 2^>^&1 ^| findstr /i "version"') do @echo %%g
        %1 -version 2>&1 | findstr /i "version"
    goto :EOF
    
    :END
        endlocal
    

    这将产生:

    The filename, directory name, or volume label syntax is incorrect.
    java version "10.0.1" 2018-04-17
    

    在我看来,for循环正在评估参数( %1 )不同。

    有什么区别?


    编辑

    可能重复的 Java Version in a batch file

    根据 this answer ,如果这确实是问题所在,我必须通过在每个包含空格的目录周围添加引号,以某种方式转换传入的路径。这听起来很痛苦,我希望有另一种解释;我仍然不明白为什么在这种情况下,仅仅传递“java”不起作用。

    (注:使用 usebackq (反引号没有区别)

    1 回复  |  直到 6 年前
        1
  •  0
  •   Sean McCallum    6 年前

    似乎将输出管道连接到 findstr 出于某种原因取消了报价。我推断这是因为当我移除 ^| findstr /i "version" 这一部分:

    @echo off
    setlocal enabledelayedexpansion
    
    call :GET_JAVA_VER "java"
    goto END
    
    :GET_JAVA_VER
        for /f "tokens=3" %%g in ('%1 -version 2^>^&1') do @echo %%g
    goto :EOF
    
    :END
        endlocal
    

    输出如下:

    "10.0.1"
    Runtime
    64-Bit
    

    这个修改后的脚本可以工作(也可以使用完整路径):

    @echo off
    setlocal enabledelayedexpansion
    
    call:GET_JAVA_VER "java"
    goto END
    
    :GET_JAVA_VER
        for /f "tokens=3" %%g in ('%~1 -version 2^>^&1') do (
            echo %%~g
            rem Stop after first line
            goto :EOF
        )
    goto :EOF
    
    :END
        endlocal