Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从批处理脚本中获取Java版本?_Java_Batch File - Fatal编程技术网

如何从批处理脚本中获取Java版本?

如何从批处理脚本中获取Java版本?,java,batch-file,Java,Batch File,我试图从下面给出的java版本输出中获得“6” 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 "ve

我试图从下面给出的java版本输出中获得“6”

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\u 21”


有人能给我指引正确的方向吗?我不太熟悉
for/f

这将提取版本号的次要部分:

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
循环中,
“tokens=3”
表示我们将只使用命令输出中的第三个令牌。与将
java-version
命令的输出重定向到文件不同,我们可以在
for
循环本身中运行此命令。插入符号(
^
)是转义字符,我们需要它,以便在命令字符串中嵌入
&
|
符号

for
循环的主体中,我们设置了一个新的var,
JAVAVER
,以便以后可以对版本字符串进行一些操作

set JAVAVER=%JAVAVER:=%
命令删除版本字符串周围的双引号

最后一个
for
循环解析java版本字符串。
delims=。
表示我们将使用句点来分隔标记。
tokens=1-3
表示我们将把前三个标记从字符串传递到循环体。现在我们可以使用显式变量
%%v和隐含变量(字母表中的下一个字母)
%%w
%%x

当我在我的系统上运行时,我得到:

Output: "1.6.0_24" 
Output: 1.6.0_24
Major: 1 
Minor: 6 
Build: 0_24
这将把java版本存储到
jver
变量中,并作为整数存储 你可以用它来做比较

if %jver% LSS 16000 echo not supported version
。您可以通过删除%k、%l和%m来使用更主要的版本。此命令提示版本

对于.bat,请使用以下命令:


根据我的测试,这是从bat获取java版本的最快方法(因为它只使用内部命令,而不使用外部命令,如
FIND
FINDSTR
,并且不使用
GOTO
,这也会减慢脚本的速度)。一些JDK供应商不支持
-fullversion
开关,或者它们的实现与Oracle提供的不同(最好避免它们)。

我对其进行了一些修改,使其能够与Java 9、10等一起使用。 这将返回1.x的次要版本,以及Java9、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

嘿,谢谢Owen。awk在windows上不起作用,我在linux上也用过,但你的更好,这里是我的java-Version2>&1 | head-1 | awk'{print$NF}“| cut-d”。-f2Ah,我的错。抱歉,我没有仔细阅读,没有注意到它是Windows。没关系,似乎我需要15个声誉来投票。我是新来此网站的,当我在该网站上有足够的声誉时,我会这样做。再次感谢!为Patrick保存它,他回答了您实际提出的问题:)在Windows上,您也可以使用PowerShell来这样做方法类似:
$a=[regex]::匹配((java-Version2>&1),“[0-9]\.[0-9]\.[0-9].[0-9]{2}”)[1].value;$a.split(“.”
)。您可以通过索引访问版本组件;[0]=major,[1]=minor,[2]=build。谢谢Patrick,这真是很酷的东西。希望有一天我会写自己的,但这对我来说相当混乱:(关于上述问题,我还需要问一件事。如果我的JAVA_主路径设置为“c:\Program Files\…”,当我运行脚本时,它会得到一个空格,并说“'c:\Program'不被识别为内部或外部命令、可操作程序或批处理文件。“我怎样才能克服这个问题呢?@Abhishek,试着在
%JAVA_HOME%
周围加上双引号,比如:
%JAVA_HOME%”
@Patrick Cuff如果代码中的JAVA可执行文件(第4行)是从一个变量派生出来的:
for/f“tokens=3%%g in(“%JAVA_HOME%%version 2^>^&1^ findstr/I“version”)怎么办
-在这种情况下,我如何指定引号?仅在JAVA_HOME周围使用引号似乎不起作用!@Neel尝试将%JAVA_HOME%(只是bin目录)添加到路径的前面(您已经指定了setlocal,因此它仅对bat文件的范围有效)。
设置路径=%JAVA_HOME%\bin;%PATH%'
对于/f“tokens=3”%g in('java-version2^>^&1^ | findstr/i“version”)
if %jver% LSS 16000 echo not supported version
@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"
@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