批处理文件:查找子字符串是否在字符串中(不是在文件中)

在批处理文件中,我有一个字符串abcdefg。我想检查bcd是否在字符串中。

不幸的是,似乎我找到的所有解决方案搜索一个文件的子字符串,而不是一个字符串的子字符串。

有没有简单的解决方法?

474656 次浏览

是的,你可以使用替换并检查原始字符串:

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

%str1:bcd=%位将用空字符串替换str1中的bcd,使其与原始字符串不同。

如果原始版本中不包含bcd字符串,修改后的版本将是相同的。

使用下面的脚本进行测试将显示它的运行情况:

@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语句是这个解决方案的核心,其他都是支持内容。
  • 在等式两边之前的x是为了确保字符串bcd正常工作。它还可以防止某些“不适当的”开头字符。

你可以将源字符串输送到findstr,并检查ERRORLEVEL的值,看看是否找到了模式字符串。值为0表示成功,并且找到了模式。这里有一个例子:

::
: 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的帖子)只会匹配大小写敏感,所以你必须为你想要匹配的每个可能迭代的每个大小写变化单独检查。

)真痛苦!只有3个字母,这意味着要完成9个不同的测试!)

此外,很多时候匹配命令输出、循环中的变量或批处理/CMD中指针变量的值更可取。

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

用法:查找[/I] [/V] "字符匹配"

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

. [/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"
)

如上所述,这对于变量中不允许字符串替换的东西非常有用:

FOR %A IN (
"Some long string with Spaces does not contain the expected string"
oihu AljB
lojkAbCk
Something_Else
"Going to evaluate this entire string for ABC as well!"
) DO (
ECHO.%~A| FIND /I "ABC">Nul && (
Echo.Found "ABC" in "%A"
) || ( Echo.Did not find "ABC" )
)


Output From a command:


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


As you can see this is the superior way to handle the check for multiple reasons.

如果你正在检测存在感,这里有一个最简单的解决方案:

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

这对于将windows命令的输出放到布尔变量中非常有用。只需将echo替换为您想要运行的命令。您还可以使用管道将Findstr串在一起以进一步限定语句。例如,用于业务控制(SC.exe)

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

这一个评估SC查询输出的windows更新服务作为一个多行文本,找到包含“状态”的行,然后发现单词“running”是否出现在该行,并相应地设置错误级别。

更好的答案是在这里:

set "i=hello " world"
set i|find """" >nul && echo contains || echo not_contains

我给出这个答案可能有点晚了,但接受的答案只适用于检查“硬编码字符串”是否是搜索字符串的一部分。

对于动态搜索,你必须这样做:

SET searchString=abcd1234
SET key=cd123


CALL SET keyRemoved=%%searchString:%key%=%%


IF NOT "x%keyRemoved%"=="x%searchString%" (
ECHO Contains.
)

注意:您可以将这两个变量作为参数。

ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)
文件中搜索子字符串的解决方案也可以搜索字符串,例如。findfindstr.
在你的例子中,简单的解决方案将是将一个字符串输送到命令中,而不是提供文件名等。< / p > < br > < p >区分大小写的字符串: echo "abcdefg" | find "bcd" < / p >

忽略大小写字符串:
echo "abcdefg" | find /I "bcd" < / p >

如果没有找到匹配,您将在CMD上得到一个空行响应,并且%ERRORLEVEL%设置为1

在Var中查找文本,示例:

var_text="demo string test"
Echo.%var_text% | findstr /C:"test">nul && (
echo "found test"
) || Echo.%var_text% | findstr /C:"String">nul && (
echo "found String with S uppercase letter"
) || (
echo "Not Found "
)

传说:

  1. & Execute_that AND execute_this
  2. || Ex: Execute_that IF_FAIL执行此操作
  3. && Ex: Execute_that IF_SUCCESSFUL执行此操作
  4. >nul命令无回显结果
  5. findstr
  6. /C:使用字符串作为字面搜索字符串

建立在@user839791的答案上,但我又添加了一些东西。

@echo off
rem --Set variable below--
set var=condition


rem --Uncomment below line to display contents of variable--
::echo The variable is %var%


rem --Change condition to desired string below--
ECHO.%var%| FIND /I "condition">Nul && (
rem --Occurs if the string is found--
Echo.Variable is "condition"
color C
pause
) || (
rem --Occurs if the string isn't found--
Echo.Variable is not "condition"
color A
pause
)

是的,我们可以在String中找到subString:

echo.%data% | FINDSTR /I "POS">Nul && (SET var=POS) || (SET noVar="variable not found")


echo.%data% | FINDSTR /I "TD1">Nul && (SET var=TD1) || (SET noVar="variable not found")


GOTO %var%


:POS
echo processes inside POS
GOTO END


:TD1
echo processes inside TD1


:END

对我来说最好的方法是这样的:

call :findInString "HelloWorld" "World"


:findInString
ECHO.%1 | FIND /I %2>Nul && (
Echo.Found
) || (
Echo.Not found
)