首页 > 解决方案 > 如何在批处理脚本子例程中获取 Java 版本?

问题描述

这个问题

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 版本可能重复

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

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

标签: batch-filefor-looppathstring-parsing

解决方案


似乎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

推荐阅读