“此时出乎意料”只在一台计算机上发生

时间:2017-01-30 08:40:40

标签: batch-file cmd

我们遇到以下命令行的问题(它在批处理文件中执行):

for /f tokens^=3^ delims^=.-_^" %%j in ('cmd /c "%JAVA_HOME%\bin\java.exe" -version 2^>^&1 ^| findstr /i "version"') do set "jver=%%j"

当我们执行这一行时,我们得到了java版本。这适用于每次,但现在我们有一台Windows 10计算机无法执行脚本并在此行失败并说:

8 was unexpected at this time

所以我假设脚本能够读取1.8.0_101 java版本字符串,但不知何故失败了。 jver变量仅在以下位置使用一次:

if %jver% LSS 8 (
    goto :jdk_wrong_version
)

有人知道为什么会出现这种奇怪的行为吗?因为几乎所有机器都没有这个命令的问题。我们执行java -version时的输出似乎很好。

编辑:

在开始时执行以下行(所以我们检查JAVA_HOME是否可用):

"%JAVA_HOME%\bin\java.exe" -version 1> NUL 2> NUL
if not %errorLevel%==0 goto :java_not_found

所以整个脚本看起来像这样:

"%JAVA_HOME%\bin\java.exe" -version 1> NUL 2> NUL
if not %errorLevel%==0 goto :java_not_found

for /f tokens^=3^ delims^=.-_^" %%j in ('cmd /c "%JAVA_HOME%\bin\java.exe" -version 2^>^&1 ^| findstr /i "version"') do set "jver=%%j"

if %jver% LSS 8 (
    goto :jdk_wrong_version
)

2 个答案:

答案 0 :(得分:1)

我怀疑 Instance = this; 不存在 - 可能"%JAVA_HOME%\bin\java.exe"尚未建立为环境变量。

答案 1 :(得分:1)

我建议使用以下批处理代码安全地检测确定Java版本时的每个可能错误:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
if not defined JAVA_HOME (
    echo Environment variable JAVA_HOME is not defined.
    goto :EOF
)
if not exist "%JAVA_HOME%\bin\java.exe" (
    echo File "%JAVA_HOME%\bin\java.exe" does not exist.
    goto :EOF
)
for /F "tokens=1-3" %%A in ('"%JAVA_HOME%\bin\java.exe" -version 2^>^&1') do (
    if /I "%%A %%B" == "java version" (
        set "JavaVersion=%%~C"
        goto EvaluateVersion
    )
)
echo Failed to determine version of installed Java.
goto :EOF

:EvaluateVersion
echo Java version is: %JavaVersion%
for /F "tokens=2 delims=." %%I in ("%JavaVersion%") do set "jver=%%I"
echo Main version is: %jver%
rem More batch code.
endlocal

Java打印版本以处理 STDERR 而不是处理 STDOUT ,这是2>&1转义运算符>和{{}的原因1}}在命令行中使用&执行 FOR

如果可以成功确定Java版本,则输出类似于:

^