Answers:
是的,您可以使用替换并检查原始字符串:
if not x%str1:bcd=%==x%str1% echo It contains bcd
该%str1:bcd=%
位将用空字符串替换bcd
in str1
,使其与原始字符串不同。
如果原始文件中不包含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
我通常会这样:
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](不得包含字符)
作为单行:
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
then IF /I
进行不区分大小写的比较。
如果您要检测是否存在,这是最简单的解决方案:
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的字符串串在一起,以使用管道进一步限定语句。用于服务控制的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更新服务的输出,该输出以多行文本形式出现,找到包含“状态”的行,然后查找该行上是否出现单词“ running”,并相应地设置错误级别。
SET STRING=abcdefgh SET SUBSTRING=bcd ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE FALSE) else (ECHO CASE TRUE)
更好的答案是在这里:
set "i=hello " world"
set i|find """" >nul && echo contains || echo not_contains
ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)
Windows
和cmd
或它的ms-dos
。MSDOS一直没有对Windows的一部分长的时间。