命令的输出:
java -version
是:
java version "1.8.0_341"
Java(TM) SE Runtime Environment (build 1.8.0_341-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.341-b10, mixed mode)
我想限制此输出以匹配版本 1.8.0_341 因此我执行以下操作:
setlocal EnableDelayedExpansion
for /f "tokens=3" %%i in ('java -version 2^>^&1 ^| findstr "1.8.0_341"') do (echo %%i)
IF %%i == "1.8.0_341" (call :JavaFound) else (call :NoJava)
:JavaFound
echo OK
:NoJava
echo Fail
但输出是:
"1.8.0_341"
Runtime
fail
其他方式:
for /f "tokens=3" %%g in ('java -version 2^>^&1 ^| findstr /i "version"') do (@echo %%~g)
IF %%~g == "1.8.0_341" (call :JavaFound) else (call :NoJava)
:JavaFound
echo OK
:NoJava
echo Fail
出去
1.8.0_341
Fail
OK
Fail
但我希望输出是:
"1.8.0"
ok
我希望输出是“1.8.0”而不是“1.8.0_341”(cmd),因为 341 是 8 的更新版本。这个想法是它可以检测以 1.8.0 开头的任何 java 版本(Windows 上的实际版本:8.0。完整版本示例:8.0.3410.10)它可以是 341 或更高或更低
我的批处理脚本有什么问题?
PD:我猜错误在于查找字符串。我尝试了几种参数组合查找字符串对我来说都没有用。也许它只在第一行寻找结果
谢谢
更新解决方法(非常长且复杂,但如果有人有一个更简单的想法,我将不胜感激):
@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%
IF %JAVA_VERSION% == 8 (goto :Java8Found) else (goto :NoJava)
:Java8Found
echo Java 8 Found
goto :eof
:NoJava
echo Fail
goto :eof
endlocal
出去
8
Java 8 Found
答案1
第三次编辑
@echo off && setlocal enabledelayedexpansion
for %%i in (ProgramFiles,ProgramFiles(x86^),ProgramW6432,nul);= do if defined %%~i (for /f delims^= %%z in (
'cmd.exe /v /q /c "2>nul where /r "!%%~i!\java" java.exe" ^| find /v /i "\jdk" ^| findstr /iel bin\java.exe
')do if "%%~nxz" == "java.exe" set "_javacmd=%%~z" && goto=%:^))else goto :nojava
%:^)
for /f tokens^=2delims^=^_^" %%g in =;('"!_javacmd!" -fullversion 2^>^&1') do set "_java=%%~g" && (
for /f tokens^=2delims^=. %%i in ('cmd.exe /v /c "call echo\!_java:_%_java:*_=%=!"
')do set "_java_version=%%~i" )
call set "_java-ver=!_java:_%_java:*_=%=!"
if !_java_version! equ 8 =;(goto :java8found );= else goto :nojava
:java8found
echo\"%_java-ver%" & echo\ok & endlocal & goto :eof
:nojava
echo\fail & endlocal & goto :eof
第二次编辑
- 更简单的是:
@echo off
java -version 2>&1 | findstr /c:"1.8.0_341" >nul && (
goto :JavaFound) || Goto :NoJava
:JavaFound
echo\ I'm here JavaFound zOk! & goto :eof
:NoJava
echo\ I'm here NoJava fail!
第一次编辑:
- 该
Findstr
命令倾向于将所有内容视为正则表达式,当传递
/L
或/c:
标志时,此处理将以字符串的形式呈现。 - 使用
Findstr /L "Literal String"
或Findstr /c:"String Literal"
@echo off
set "_str_out="
for /f tokens^=2delims^=^"_ %%i in (
'java -version 2^>^&1 ^| findstr /c:"1.8.0" ^|find /v ")"
')do set "_str_out=%%~i"
if defined _str_out (echo\"%_str_out%" & echo\ok)else echo\fail
在For
循环中,您可以使用多个分隔符进行更改,在本例中为双引号和下划线:delims^=^"_
通过使用你的Findstr
来获取你想要的字符串,并使用来Find /v ^)
抑制循环中的其他不相关的行,你就可以得到字符串,并且只有它在循环输出中