【问题标题】:How to get Java version in a batch script subroutine?如何在批处理脚本子例程中获取 Java 版本?
【发布时间】:2018-11-12 01:07:45
【问题描述】:

来自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 和反引号没有区别)

【问题讨论】:

    标签: batch-file for-loop path string-parsing


    【解决方案1】:

    似乎由于某种原因,将输出传送到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
    

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 2021-09-09
      • 2020-03-20
      • 2013-07-16
      • 2013-10-01
      • 1970-01-01
      • 2013-07-30
      • 2011-06-15
      • 2014-08-21
      相关资源
      最近更新 更多