2017-01-30 41 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

相關問題