Как получить версию Java из пакетного скрипта?

Я пытаюсь получить '6' из вывода Java-версии, приведенной ниже

java version "1.6.0_21"
Java(TM) SE Runtime Environment (build 1.6.0_21-b07)
Java HotSpot(TM) Client VM (build 17.0-b17, mixed mode, sharing)

Для того же я написал этот пакетный скрипт

set VERSION6="1.6.0_21"
java -version 2>&1 | findstr "version" >ab.txt
for /f "tokens=3" %%g in (ab.txt) do (
  if not %%g == %VERSION6% echo %%g
  echo %%g
)

%%g отображает "1.6.0_21"

Может кто-нибудь направить меня в правильном направлении? Я не очень знаком с for /f,

4 ответа

Решение
@echo off
setlocal

set VERSION6="1.6.0_21"
for /f "tokens=3" %%g in ('java -version 2^>^&1 ^| findstr /i "version"') do (
    @echo Output: %%g
    set JAVAVER=%%g
)
set JAVAVER=%JAVAVER:"=%
@echo Output: %JAVAVER%

for /f "delims=. tokens=1-3" %%v in ("%JAVAVER%") do (
    @echo Major: %%v
    @echo Minor: %%w
    @echo Build: %%x
)

endlocal

Во-первых for петли, "tokens=3" говорит, что мы собираемся просто использовать третий токен из вывода команды. Вместо того, чтобы перенаправить вывод java -version команда в файл, мы можем запустить эту команду в for петля сама Кареты (^) являются escape-символами и необходимы, чтобы мы могли вставить >, & а также | символы в командной строке.

В теле for цикл, мы устанавливаем новую переменную, JAVAVER, так что мы можем сделать некоторые манипуляции со строкой версии позже.

set JAVAVER=%JAVAVER:"=% Команда удаляет двойные кавычки вокруг строки версии.

Последний for цикл анализирует строку версии Java. delims=. говорит, что мы собираемся разграничить токены, используя точки. tokens=1-3 говорит, что мы собираемся передать первые три токена из строки в тело цикла. Теперь мы можем получить компоненты строки версии Java, используя явную переменную, %%v и подразумеваемые переменные (следующие буквы в алфавите) %%w а также %%x,

Когда я запускаю это в моей системе, я получаю:

Output: "1.6.0_24" 
Output: 1.6.0_24
Major: 1 
Minor: 6 
Build: 0_24

Я внес некоторые изменения в ответ Патрика, чтобы он работал с Java 9, 10 и т. Д. Это возвращает младшую версию для 1.x и основную версию для Java 9, 10 и т. Д.

@echo off
setlocal

rem We use the value the JAVACMD environment variable, if defined
rem and then try JAVA_HOME
set "_JAVACMD=%JAVACMD%"
if "%_JAVACMD"=="" (
  if not "%JAVA_HOME%"=="" (
    if exist "%JAVA_HOME%\bin\java.exe" set "_JAVACMD=%JAVA_HOME%\bin\java.exe"
  )
)
if "%_JAVACMD%"=="" set _JAVACMD=java

rem Parses x out of 1.x; for example 8 out of java version 1.8.0_xx
rem Otherwise, parses the major version; 9 out of java version 9-ea
set JAVA_VERSION=0
for /f "tokens=3" %%g in ('%_JAVACMD% -Xms32M -Xmx32M -version 2^>^&1 ^| findstr /i "version"') do (
  set JAVA_VERSION=%%g
)
set JAVA_VERSION=%JAVA_VERSION:"=%
for /f "delims=.-_ tokens=1-2" %%v in ("%JAVA_VERSION%") do (
  if /I "%%v" EQU "1" (
    set JAVA_VERSION=%%w
  ) else (
    set JAVA_VERSION=%%v
  )
)

@echo %JAVA_VERSION%

endlocal

Это позволит извлечь второстепенную часть номера версии:

java -version 2>&1 | awk '/version/ {print $3}' | awk -F . '{print $2}'

Однако может быть лучше извлечь major.minor и сопоставить его с этим в случае, если Oracle когда-либо снова изменит схему номеров версий, например:

java -version 2>&1 | awk '/version/ {print $3}' | egrep -o '[0-9]+\.[0-9]+'
for /f tokens^=2-5^ delims^=.-_^" %j in ('java -fullversion 2^>^&1') do @set "jver=%j%k%l%m"

Это сохранит версию Java в jver переменная и как целое число И вы можете использовать его для сравнения.EG

if %jver% LSS 16000 echo not supported version

. Вы можете использовать более основную версию, удалив%k,% l и% m. Эта версия командной строки.

Для.bat используйте это:

@echo off
PATH %PATH%;%JAVA_HOME%\bin\
for /f tokens^=2-5^ delims^=.-_^" %%j in ('java -fullversion 2^>^&1') do set "jver=%%j%%k%%l%%m"

Согласно моим тестам, это самый быстрый способ получить версию Java от bat (так как она использует только внутренние команды, а не внешние, так как FIND, FINDSTR и не использует GOTO что также может замедлить сценарий). Некоторые поставщики JDK не поддерживают -fullversion switch или их реализация отличается от той, что предоставляется Oracle (лучше избегать их).

Другие вопросы по тегам