2017-01-30 5 views
1

「現時点では予想外でした」 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を実行したときの出力は上手く見えます。

EDIT:

次の行は、起動時に実行されている(だから我々は、JAVA_HOMEが利用可能であるかどうかをチェック):

"%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

間違っている。 – Highriser

+2

'( 'cmd/c"%JAVA_HOME%\ bin \ java.exe "-version 2 ^> ^&1^| findstr/i" version "')'から 'cmd/C'を削除すると、残りの文字列' ( "%JAVA_HOME%\ bin \ java.exe" -version 2 ^> ^&1^| findstr/i "version" ') 'は、%JAVA_HOME%\ bin \ java.exeとして実行されます。 ^&1^| findstr/i "for/F"によって "version"は無効です。検索文字列 'version'の前後に引用符" ""を入れてはいけません。これは 'for/F'が周囲の' '' *と*を取り除くためです。もし残っている文字列が '' ''で囲まれていれば、それらも取り除かれます。 – aschipfl

+0

いいえ。最初の質問:JAVA_HOMEパスにスペースがあるとどうなりますか?キャラクターを取り除いた他のものはうまくいった。ありがとう! :) – Highriser

答えて

1

I:

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

だから全体のスクリプトは次のようになります"%JAVA_HOME%\bin\java.exe"が存在しない可能性があります。おそらくJAVA_HOMEが環境変数として確立されていません。

+0

"%JAVA_HOME%\ bin \ java.exe" -version 1> NUL 2> NUL %errorLevel%== 0 goto:java_not_found - 質問を編集しました。ありがとう。 – Highriser

+0

そのコードはエラーレベル '3'を生成します。見やすい方法は、あなたの 'for/f ... %% j'の直前に' echo "%java_home%" '行を追加して疑いがないようにすることです。あなたが記述した症状は、 'java_home'がエスケープされていないことと一貫しています。多分あなたは仕事を予定していますか?それが別のユーザーの下で実行されている場合、または不正なアクセスで問題が発生する可能性があります。 – Magoo

+0

OK。私はこのケースを再現しようとしました。私は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のではなく、その理由であるハンドルSTDOUTSTDERRを処理するためのバージョンを表示します2>&1の場合と&^とすると、の場合はで実行されます。

Javaのバージョンが正常に決定することができた場合は、出力は次のようなものです:ファイル名、ディレクトリ名、またはボリュームラベルの構文は次のとおりです。私は次のエラーC ' `cmdは/発生削除した場合

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

入力いただきありがとうございます。しかし、これは基本的に私たちがやっていることです。私はほぼ同じFORループを使用しています。 FORループの直前でjava.exeを直接実行する同様のチェックをしています。 (したがって、自動的にエラーレベル3になり、終了します)。これは役に立ちません。これは、スクリプトがすでにそのような障害を検出しているためです。 – Highriser

+0

はい、投稿されたバッチコードは基本的に同じですが、完全に同じではありません。たとえば、このバッチファイルは、このバッチファイルに必要なコマンド拡張機能を明示的に有効にします。また、 'JAVA_HOME'が定義されておらず、' C:\ bin \ java.exe'のようなものがある場合、カレントドライブのルートの 'bin'サブディレクトリに' java.exe'を実行しません。あなたのマシンでこのバッチファイルを試してみましたか?バッチスクリプトがエラーで終了するマシンの出力は何ですか? – Mofi

+1

過去に見たことは、あるマシン上のバッチファイル内の 'findstr'が'%SystemRoot%\ System32 \ findstr.exe'を実行しなかったということです。そのアプリケーションディレクトリには、アプリケーションディレクトリにWindowsの 'findstr'とは異なる働きをする' findstr'も含まれています。したがって、多くのWindowsコンピュータ上で動作するように設計されたバッチファイルは、できるだけ「PATH」に依存しないように書き込むことをお勧めします。 – Mofi

関連する問題