如何使用 findstr 找到精确匹配

如何使用 findstr 找到精确匹配

命令的输出:

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 ^)抑制循环中的其他不相关的行,你就可以得到字符串,并且只有它在循环输出中

相关内容