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

Я пытаюсь получить "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)

Для этого я написал эту партию script

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.

Ответ 1

@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 мы устанавливаем новый var, 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

Ответ 2

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

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

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

java -version 2>&1 | awk '/version/ {print $3}' | egrep -o '[0-9]+\.[0-9]+'

Ответ 3

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

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

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, что также может замедлить script). Некоторые поставщики JDK не поддерживают коммутатор -fullversion или их реализация не такая же, как в Oracle Oracle (лучше их избегать).