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

Windows 批处理文件:查找子字符串是否在字符串中(不在文件中),windows,batch-file,cmd,substring,Windows,Batch File,Cmd,Substring,在批处理文件中,我有一个字符串abcdefg。我想检查bcd是否在字符串中 不幸的是,我找到的所有解决方案似乎都是在文件中搜索子字符串,而不是在字符串中搜索子字符串 是否有一个简单的解决方案?是的,您可以使用替换并对照原始字符串进行检查: if not x%str1:bcd=%==x%str1% echo It contains bcd %str1:bcd=%位将用空字符串替换str1中的bcd,使其与原始字符串不同 如果原始版本中不包含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
几点注意:

  • 如果
    语句是这个解决方案的核心,那么其他所有内容都是支持内容
  • 相等两边之前的
    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](不能包含字符)

作为单线:

ECHO.%Variable%| FIND/I“ABC”>Nul&&(ECHO.FIND“ABC”)| |(ECHO.not FIND“ABC”)
多行:

ECHO.%Variable%| FIND/I“ABC”>Nul&&(
Echo.找到“ABC”
) || (
Echo.未找到“ABC”
)
如前所述,这对于不在允许字符串替换的变量中的事物非常有用:

中的%A的
(
“某些带空格的长字符串不包含所需的字符串”
奥胡阿尔布
洛伊卡贝克
还有别的吗
“还要为ABC计算整个字符串!”
)做(
ECHO.%~A| FIND/I“ABC”>Nul&&(
回显。在“%A”中找到“ABC”
)| |(Echo.未找到“ABC”)
)
命令的输出:
NLTest | FIND/I“ABC”>Nul&&(Echo.FIND“ABC”)|(Echo.not FIND“ABC”)
正如您所见,这是处理支票的最佳方式,原因有多种。

如果您正在检测是否存在,以下是最简单的解决方案:

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 for windows update services输出的多行文本,查找包含“状态”的行,然后查找该行是否出现“正在运行”一词,并相应地设置错误级别。

更好的答案是:


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

对于动态搜索,您必须执行以下操作:

SET searchString=abcd1234
SET key=cd123

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

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

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

文件中搜索子字符串的解决方案也可以搜索字符串,例如
find
findstr

ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)
在您的例子中,简单的解决方案是将一个字符串插入命令,而不是提供一个文件名

区分大小写的字符串:
echo“abcdefg”|查找“bcd”

忽略字符串的大小写:
echo“abcdefg”|查找/I“bcd”


如果未找到匹配项,您将在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 " 
    )
图例:

  • &
    执行那个,执行这个
  • ||
    Ex:如果执行失败,则执行该命令
  • &&
    Ex:Execute,如果成功执行该命令
  • >nul
    命令无回显结果
  • /C:
    使用字符串作为文本搜索字符串
  • 基于的答案,但我还添加了一些内容

    @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
    )
    

    顺便说一句,它通常是
    Windows
    cmd
    ms-dos
    。MSDOS已经很久没有成为Windows的一部分了。如果你正在研究如何在for循环中进行字符串替换:这很好,但当搜索值不是常量(如bcd)而是变量时,我很难让它起作用。过了很长时间,我终于明白了。假设searchVal已经声明为“x!str1:%searchVal%=!”==“x%str1%”@Gary,因为这不是这个问题的要求之一,您可能应该问一个不同的问题,也许可以链接回这个问题作为参考。愿意帮忙的人并不短缺。事实上,你仍然应该问这个问题并自己回答(现在你已经弄明白了),这样对未来的搜索者会有用。自我回答被认为是可以接受的。非常好的解决方案,
    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 " 
        )
    
    @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
    )