2017-01-30 42 views
1

上我们有使用下面的命令行(它是在一个批处理文件执行)一个问题:“在这个时候意外”发生仅单台计算机

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

如果我删除了'CMD/C'出现以下错误:文件名,目录名或卷标语法不正确。 – Highriser

+2

如果从'( 'CMD/C “%JAVA_HOME%\ BIN \ java.exe的” -version 2 ^> ^&1^| FINDSTR/I “版本”')除去'CMD/C'',剩余的字符串' ( ' “%JAVA_HOME%\ BIN \ java.exe的” -version 2 ^> ^&1^| FINDSTR/I “版本”')作为'%JAVA_HOME%\ BIN \ java.exe的”执行'-version 2 ^> ^&1^| findstr/i“version' by'for/F',这是无效的;不要在搜索字符串'version'周围加''“',它会起作用;这是因为'为/ F'消除周围'“”'*和*,如果剩余的字符串出现在'“”'包围,他们将被删除,以及... – aschipfl

+0

好。第一个问题:当JAVA_HOME路径有空格时会发生什么?去除字符的其他东西奏效。谢谢! :) – Highriser

回答

1

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

+0

我们在开始执行下面的台词: “%JAVA_HOME%\ BIN \ java.exe的” -version 1> 2的NUL> NUL 若不%ERRORLEVEL%== 0转到:java_not_found - 我编辑了这个问题。谢谢。 – Highriser

+0

该代码应该产生错误级别'3'。简单的方法是在'for/f ... %% j'之前添加一行'echo'%java_home%“',这是毫无疑问的。你描述的症状与'java_home'不一致。你是否想要安排这份工作?如果它在不同的用户下运行或访问不正确,它可能会出现问题... – Magoo

+0

好的。我试图重现这种情况。我删除了我的java_home变量。和'errorlevel 0'工作。 'errorlevel 3'不起作用。我们不安排这项工作。 – Highriser

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与由FOR执行命令行逸出运营>&^

如果Java版本可以成功地确定,输出是一样的东西:

Java version is: 1.7.0_55 
Main version is: 7 
+0

感谢您的输入。但这基本上就是我们正在做的。我使用几乎相同的FOR循环。就在FOR循环之前,我正在做一个类似的检查,直接执行java.exe。 (所以它会自动导致错误级别3并退出。)所以这没有帮助,因为我们的脚本已经能够检测到这些类型的错误。 – Highriser

+0

是的,我知道发布的批处理代码基本相同,但它不完全相同。例如,此批处理文件显式启用此批处理文件所需的命令扩展。如果'没有定义JAVA_HOME'有缘有例如它不运行在当前驱动器的根目录'java.exe'在子目录''bin' C:\ BIN \ java.exe'。你有没有在你的机器上试过这个批处理文件?在批处理脚本退出时出错的机器上的输出是什么? – Mofi

+1

我也看到在过去是刚刚'findstr'在一台机器上的一个批处理文件并没有导致的%SystemRoot的'执行%\ SYSTEM32 \ findstr.exe'因为机器安装的应用程序套件,添加上它的应用程序目录在安装到'PATH'开始时(而不是在末尾)包含在应用程序目录中,还有一个'findstr',它与Windows'findstr'不同。因此,为了在许多Windows计算机上运行而设计的批处理文件尽可能独立于'PATH'上,这总是一个好主意。 – Mofi

相关问题