2017-01-30 8 views
1

Wir haben ein Problem mit der folgenden Befehlszeile bekam (es in einer Batch-Datei ausgeführt wird):„war zu diesem Zeitpunkt unerwartet“ geschieht nur auf einzelnen Computer

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

Wenn wir diese Linie ausführen, erhalten wir die Java-Version. Dies funktioniert jedes Mal, aber jetzt haben wir einen Computer hier unter Windows 10, die das Skript nicht ausführen kann und nicht auf dieser Linie und sagt:

8 was unexpected at this time 

Also gehe ich davon aus dem Skript in der Lage ist, die 1.8.0_101 Java-Version zu lesen String aber irgendwie scheitert. Die Variable jver wird nur einmal verwendet:

if %jver% LSS 8 (
    goto :jdk_wrong_version 
) 

Weiß jemand, warum dieses seltsame Verhalten auftritt? Weil fast alle Maschinen kein Problem mit diesem Befehl haben. Die Ausgabe, wenn wir Java-Version ausführen, scheint in Ordnung.

EDIT:

Folgende Zeilen zu Beginn ausgeführt werden (also wir überprüfen, ob JAVA_HOME verfügbar ist):

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

Also das ganze Skript wie folgt aussieht:

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

Wenn ich das entfernen 'cmd/c 'der folgende Fehler tritt auf: Der Dateiname, Verzeichnisname oder die Syntax Volume-Label ist falsch. – Highriser

+2

Wenn Sie 'cmd/C' aus' ('cmd/c "% JAVA_HOME% \ bin \ java.exe" -Version 2 ^>^& 1^| findstr/i "Version"') entfernen '', die verbleibende Zeichenfolge ' ('"% JAVA_HOME% \ bin \ java.exe" -Version 2 ^>^& 1^| findstr/i "Version"') wird als '% JAVA_HOME% \ bin \ java.exe '-Version 2 ^> ausgeführt^& 1^| findstr/i "version" von 'for/F', was ungültig ist; setze keine Anführungszeichen '' '' um die Suchzeichenfolge 'version' und es wird funktionieren; Das liegt daran, dass 'for/F' die umgebenden' '' '* und * entfernt, wenn die verbleibende Zeichenkette von' '' 'umgeben angezeigt wird, werden sie ebenfalls entfernt ... – aschipfl

+0

Okay. Erste Frage: Was passiert, wenn der Pfad JAVA_HOME Leerzeichen enthält? Die anderen Sachen mit dem Entfernen der Charaktere funktionierten. Vielen Dank! :) – Highriser

Antwort

1

I vermuten, dass "%JAVA_HOME%\bin\java.exe" nicht existiert - möglicherweise wurde JAVA_HOME nicht als Umgebungsvariable festgelegt.

+0

Am Anfang führen wir folgende Zeilen aus: "% JAVA_HOME% \ bin \ java.exe" -Version 1> NUL 2> NUL wenn nicht% errorLevel% == 0 goto: java_not_found - Ich habe die Frage bearbeitet. Vielen Dank. – Highriser

+0

Dieser Code sollte Fehlerlevel "3" erzeugen. Eine einfache Möglichkeit ist das Hinzufügen einer Zeile 'echo"% java_home% "' kurz vor Ihrem 'for/f ... %% j', also besteht kein Zweifel.Die Symptome, die Sie beschreiben, stehen im Einklang damit, dass 'java_home' nicht erstellt wird. Versuchen Sie vielleicht, den Job zu planen? Wenn es unter einem anderen Benutzer oder mit falschem Zugriff ausgeführt wird, kann es Probleme geben ... – Magoo

+0

Okay. Ich habe versucht, diesen Fall zu reproduzieren. Ich habe meine Variable java_home entfernt. Und der Fehlerlevel 0 funktioniert. Der Fehlerlevel 3 funktioniert nicht. Wir planen den Job nicht. – Highriser

1

Ich schlage vor, den folgenden Batch-Code zu verwenden, sicher auf der Bestimmung Version von Java jeden möglichen Fehler zu erkennen:

@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 druckt die Version STDERR statt Griff STDOUT das der Grund ist, zu handhaben für 2>&1 mit der Flucht der Operatoren > und & mit ^ in der Befehlszeile von FÜR ausgeführt.

Wenn die Java-Version erfolgreich ermittelt werden kann, ist der Ausgang so etwas wie:

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

Danke für Ihre Eingabe. Aber das ist im Grunde, was wir tun. Ich benutze fast die gleiche FOR-Schleife. Und genau vor der FOR-Schleife mache ich eine ähnliche Überprüfung, wo ich die java.exe direkt ausführe. (Es würde also automatisch zu Errorlevel 3 und Exit führen.) Das hilft also nicht, weil unser Skript diese Art von Fehlern bereits erkennen würde. – Highriser

+0

Ja, ich weiß, dass der veröffentlichte Stapelcode im Prinzip derselbe ist, aber es ist nicht vollständig derselbe. Diese Stapeldatei aktiviert beispielsweise explizit die für diese Stapeldatei erforderlichen Befehlserweiterungen. Und es wird 'java.exe' nicht im Unterverzeichnis' bin' im Stamm des aktuellen Laufwerks ausgeführt, wenn 'JAVA_HOME' nicht definiert ist und zufällig beispielsweise 'C: \ bin \ java.exe'. Haben Sie diese Batch-Datei auf Ihren Maschinen überhaupt ausprobiert? Was war die Ausgabe auf der Maschine, auf der das Stapelscript mit dem Fehler beendet wurde? – Mofi

+1

Was ich in der Vergangenheit auch gesehen habe, war, dass '' findstr' 'in einer Batchdatei auf einem Rechner nicht zur Ausführung von '% SystemRoot% \ System32 \ findstr.exe' führte, weil auf diesem Rechner eine Anwendungssuite installiert wurde sein Anwendungsverzeichnis während der Installation zu 'PATH' am Anfang (anstatt am Ende anzufügen), das im Anwendungsverzeichnis auch einen' findstr' enthält, der anders als Windows 'findstr' funktioniert. Daher ist es immer eine gute Idee, Batch-Dateien zu schreiben, die für die Ausführung auf vielen Windows-Rechnern entwickelt wurden, die so unabhängig von 'PATH' wie möglich sind. – Mofi

Verwandte Themen