我们遇到以下命令行的问题(它在批处理文件中执行):
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
)
答案 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版本,则输出类似于:
^