Как получить версию Java из пакетного скрипта? - PullRequest
9 голосов
/ 15 апреля 2011

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

11 голосов
/ 15 апреля 2011
@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.Символы (^) являются управляющими символами и необходимы для того, чтобы мы могли вставить символы >, & и | в командную строку.

В теле 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
1 голос
/ 06 апреля 2018

Я внес некоторые изменения в ответ Патрика , чтобы он работал с 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
1 голос
/ 15 апреля 2011

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

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

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

java -version 2>&1 | awk '/version/ {print $3}' | egrep -o '[0-9]+\.[0-9]+'
0 голосов
/ 26 апреля 2014
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, что также может замедлить скрипт). Некоторые поставщики JDK не поддерживают коммутатор -fullversion, или их реализация не такая, как в Oracle (лучше избегайте их).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...