Как получить версию 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 (лучше их избегать).