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=%
位将用空stringreplacestr1
的bcd
,使其与原始字符不同。
如果原始文件中不包含bcd
string,则修改后的版本将相同。
使用以下脚本进行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”,并相应地设置错误级别。