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