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

时间:2011-08-10 04:38:05

标签: windows batch-file cmd substring

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

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

有一个简单的解决方案吗?

13 个答案:

答案 0 :(得分:255)

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

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

%str1:bcd=%位会将bcd中的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正常工作。它还可以防止某些“不正当”的起始角色。

答案 1 :(得分:100)

您可以将源字符串传递给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

答案 2 :(得分:41)

我通常做这样的事情:

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

我不知道这是不是最好的方式。

答案 3 :(得分:17)

为了兼容性和易用性,通常最好使用FIND来执行此操作。

您还必须考虑是否要区分大小写或不区分大小写。

78分的方法(我相信我指的是paxdiablo的帖子)只会匹配Case Sensitively,所以你必须为你想要匹配的每个可能的迭代单独检查每个案例变体。

(多么痛苦!只有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 (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" )

正如您所看到的,这是处理检查的最佳方式,原因有多种。

答案 4 :(得分:9)

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

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"发生在该行上,并相应地设置errorlevel。

答案 5 :(得分:3)

要在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和execute_this
  2. ||例如:Execute_IF_FAIL执行此操作
  3. &&例如:Execute_IF_SUCCESSFUL执行此操作
  4. >nul无命令回显结果
  5. findstr
  6. /C:使用字符串作为文字搜索字符串

答案 6 :(得分:1)

更好的答案是here

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

答案 7 :(得分:1)

我可能对这个答案来得太晚了,但是被接受的答案仅适用于检查“硬编码字符串”是否是搜索字符串的一部分。

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

SET searchString=abcd1234
SET key=cd123

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

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

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

答案 8 :(得分:1)

文件中搜索子字符串的解决方案也可以搜索字符串,例如。 findfindstr
对于您来说,简单的解决方案是将字符串传递到命令中,而不是提供文件名。

区分大小写的字符串:
echo "abcdefg" | find "bcd"

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

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

答案 9 :(得分:0)

all('#id-of-select option')[1].select_option

答案 10 :(得分:0)

我在计算机上安装了 python ,在新的 python 文件中输入以下内容:

fullstring = "abcdefg"
substring = "bcd"

if substring in fullstring:
    print "It contains bcd"
else:
    print "It doesn't contains bcd"

批处理中,写存储的位置,在我的情况下:

"%CD%\find.py"

答案 11 :(得分:0)

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

答案 12 :(得分:0)

是的,我们可以在字符串中找到子字符串:

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