batch file:查找子string是否在string中(不在文件中)

在batch file中,我有一个stringabcdefg 。 我想检查bcd是否在string中。

不幸的是,似乎我find的所有解决scheme都search一个子string的文件 ,而不是一个子string的string。

有这个简单的解决scheme吗?

是的,你可以使用replace,并检查原始string:

 if not x%str1:bcd=%==x%str1% echo It contains bcd 

%str1:bcd=%位将用空stringreplacestr1bcd ,使其与原始字符不同。

如果原始文件中不包含bcdstring,则修改后的版本将相同。

使用以下脚本进行testing将显示它的实际运行情况:

 @setlocal enableextensions enabledelayedexpansion @echo off set str1=%1 if not x%str1:bcd=%==x%str1% echo It contains bcd endlocal 

而各种运行的结果:

 c:\testarea> testprog hello c:\testarea> testprog abcdef It contains bcd c:\testarea> testprog bcd It contains bcd 

几个注意事项:

  • if声明是这个解决scheme的肉,其他一切都是支持的东西。
  • 在平等的双方之前的x是确保stringbcd工作正常。 它也可以防止某些“不正确的”起始字符。

您可以将源string传送给findstr并检查ERRORLEVEL的值以查看是否find了模式string。 值为零表示成功,并find模式。 这里是一个例子:

 :: : Y.CMD - Test if pattern in string : P1 - the pattern : P2 - the string to check :: @echo off echo.%2 | findstr /C:"%1" 1>nul if errorlevel 1 ( echo. got one - pattern not found ) ELSE ( echo. got zero - found pattern ) 

当这在CMD.EXE中运行时,我们得到:

 C:\DemoDev>y pqrs "abc def pqr 123" got one - pattern not found C:\DemoDev>y pqr "abc def pqr 123" got zero - found pattern 

我通常做这样的事情:

 Echo.%1 | findstr /C:"%2">nul && ( REM TRUE ) || ( REM FALSE ) 

例:

 Echo.Hello world | findstr /C:"world">nul && ( Echo.TRUE ) || ( Echo.FALSE ) Echo.Hello world | findstr /C:"World">nul && (Echo.TRUE) || (Echo.FALSE) 

输出:

 TRUE FALSE 

我不知道这是否是最好的方法。

为了兼容性和易用性,通常使用FIND来做到这一点。

您还必须考虑是否要匹配大小写敏感或不区分大小写。

78分的方法(我相信我是指paxdiablo的post)只会匹配大小写敏感,所以您必须对每个可能的迭代进行单独的检查,以找出每个可能需要匹配的迭代。

(真是痛苦!只有3个字母,意味着9个不同的testing才能完成检查!)

另外,很多时候最好匹配命令输出,一个循环中的variables或批处理/ CMD中指针variables的值,这不是直接的。

由于这些原因,这是一个更好的替代方法:

使用:查找[/ I] [/ V]“要匹配的字符”

[/ I](不区分大小写)[/ V](不能包含字符)

作为单行:

 ECHO.%Variable% | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" ) 

多行:

 ECHO.%Variable%| FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" ) 

如上所述,对于不允许stringreplace的variables,这非常适合:

 FOR %A IN (oihu AljB lojkAbCk) DO ( ECHO.%~A| FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" ) ) 

输出来自命令:

 NLTest | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" ) 

正如你所看到的,这是处理多种原因检查的最好方法。

如果你正在检测存在,这是最简单的解决scheme:

 SET STRING=F00BAH SET SUBSTRING=F00 ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE TRUE) else (ECHO CASE FALSE) 

这非常适合将windows命令的输出放入布尔variables。 只需用你想运行的命令replace回显即可。 您还可以将Findstr串起来,以使用pipe道进一步限定语句。 EG用于服务控制(SC.exe)

 SC QUERY WUAUSERV | findstr /C:"STATE" | FINDSTR /C:"RUNNING" & IF ERRORLEVEL 1 (ECHO case True) else (ECHO CASE FALSE) 

那个评估SC Query for Windows Update服务的输出结果是多行文本,find包含“state”的行,然后查找该行是否出现“running”,并相应地设置错误级别。