abcdefg
。 我想检查字符串中是否存在bcd
。不幸的是,似乎我找到的所有解决方案都是在文件中搜索子字符串,而不是在字符串中搜索子字符串。
是否有简便的方法来解决这个问题?
abcdefg
。 我想检查字符串中是否存在bcd
。是的,您可以使用替换并检查原始字符串:
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
的值,以查看是否找到了模式字符串。值为零表示成功并且已找到模式。以下是一个示例:
::
: 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
findstr
命令无法正常工作,例如,echo c:\_ | findstr /C:"\_"
会返回匹配结果,但echo c:\_ | findstr /C:":\_"
无法找到匹配结果,同样echo c:\_ | findstr /C:"c:\_"
也无法找到匹配结果。解决方法是使用find
命令代替findstr
命令。 - undefined我通常会做这样的事情:
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中指针变量的值,这并不那么直接。
出于这些原因,这是一种更可取的替代方法:
使用:Find [/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"
)
正如提到的,这对于那些不在允许字符串替换的变量中的内容非常适用:
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.
setlocal EnableExtensions
然后使用 IF /I
进行大小写不敏感的比较。 - cychoi如果您正在检测是否存在,这里是最简单的解决方案:
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)
该命令用于评估Windows更新服务的SC查询输出,它以多行文本形式呈现,找到包含“state”字样的行,然后查看该行中是否包含“running”单词,并相应地设置错误级别。
在变量中查找文本,例如:
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 "
)
图例:
&
执行"execute_that"和"execute_this"||
如果"execute_that"执行失败,则执行"execute_this"&&
如果"execute_that"执行成功,则执行"execute_this">nul
不在命令行中显示结果/C:
把字符串作为字面搜索字符串使用我可能来得有点晚,但是接受的答案只适用于检查“硬编码字符串”是否是搜索字符串的一部分。
对于动态搜索,您需要执行以下操作:
SET searchString=abcd1234
SET key=cd123
CALL SET keyRemoved=%%searchString:%key%=%%
IF NOT "x%keyRemoved%"=="x%searchString%" (
ECHO Contains.
)
对我而言最好的方法是这样的:
call :findInString "HelloWorld" "World"
:findInString
ECHO.%1 | FIND /I %2>Nul && (
Echo.Found
) || (
Echo.Not found
)
ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)
find
或findstr
。echo "abcdefg" | find "bcd"
忽略字符串大小写:echo "abcdefg" | find /I "bcd"
如果没有找到匹配项,则CMD会返回一个空行响应,%ERRORLEVEL%设置为1。