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

Posted

技术标签:

【中文标题】批处理文件:查找子字符串是不是在字符串中(不在文件中)【英文标题】:Batch file: Find if substring is in string (not in a file)批处理文件:查找子字符串是否在字符串中(不在文件中) 【发布时间】:2011-10-23 18:32:38 【问题描述】:

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

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

有没有简单的解决方案?

【问题讨论】:

顺便说一句,通常是Windowscmd 它是ms-dos。 MSDOS 已经 很长时间 没有成为 Windows 的一部分了。 【参考方案1】:

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

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可以正常工作。它还可以防止某些“不正确”的起始字符。

【讨论】:

如果您正在寻找如何在 FOR 循环中进行字符串替换:***.com/a/6310580/623622 这很好,但是当搜索值不是常量(如 bcd)而是变量时,我很难让它工作。很久之后,我终于想通了。假设 searchVal 已声明,“x!str1:%searchVal%=!”=="x%str1%" @Gary,因为这不是这个问题的要求之一,你可能应该问一个不同的问题,也许链接回这个问题作为参考。愿意提供帮助的人不乏。事实上,您仍然应该提出这个问题并自己回答(现在您已经弄清楚了),以便它对未来的搜索者有用。自我回答被认为是可以接受的。 很好的解决方案,但是你需要用双引号括起来,否则它不适用于值中有空格的变量,例如:if not "x%str1:bcd=%" == "x%str1%" echo 它包含 bcd "'=str1 此时出乎意料"【参考方案2】:

您可以将源字符串通过管道传输到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:/C 后缺少参数。得到一个 - 找不到模式” 我也能够轻松地让它在 for 循环中工作。我无法为 for 循环修改已接受的答案(不过,我并没有很努力地找出它为什么不起作用)。 这个解决方案很容易阅读。我建议检查this other answer 的一些陷阱。【参考方案3】:

我通常会这样做:

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

我不知道这是否是最好的方法。

【讨论】:

我需要递归查找和比较文件名。这也是唯一对我有用的解决方案!超级方便,非常简单。【参考方案4】:

为了兼容性和易用性,通常最好使用 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 然后IF /I 进行不区分大小写的比较。 这不是一个真正的选择,因为您仍然需要隔离字符以进行“IF”比较。 IF 与“喜欢”条款不匹配,因为我回复的 OP 和特定解决方案正在寻找。, 嗨,本,请不要以其他答案的分数来参考。这很可能会改变。请通过该答案的作者姓名或描述该答案中使用的技术的简短短语来更新您对另一个答案的答案。 嗨,电话标记器,三年前我写原始帖子时,这将是一个有用的评论,但是正如你提到的,积分值都发生了变化。我不再记得我指的是哪个帖子,而且我今天也不会用积分值来指代它们。还是谢谢。 我环顾四周,我相信我指的是 paxdiablo,所以我修改了文本以表明这一点。【参考方案5】:

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

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

【讨论】:

你有你的 IF 语句倒退.. 用 abcdefg 查看原件,你就会翻转你的逻辑。有用。你拥有它的方式,它没有。 SET STRING=abcdefgh SET SUBSTRING=bcd ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE FALSE) else (ECHO CASE TRUE) 即使@Leptonator 使用倒置逻辑是正确的,也应该得到 +1。这是一个简单易用的解决方案。【参考方案6】:

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

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

SET searchString=abcd1234
SET key=cd123

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

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

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

【讨论】:

【参考方案7】:

要在 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 " 
    )

图例:

    & Execute_that AND execute_this || Ex: Execute_that IF_FAIL 执行这个 && Ex: Execute_that IF_SUCCESSFUL 执行这个 >nul命令没有回显结果 findstr /C: 使用字符串作为文字搜索字符串

【讨论】:

你能在你的答案周围添加一些上下文吗?【参考方案8】:

更好的答案是here:

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

【讨论】:

在您使用 SET 链接的问题是解决特定和独特的需求,因此提及“SET”很重要。但是,它似乎没有为当前的讨论添加任何内容,因为已经提供了将命令传递给 FIND 命令并测试结果的方法【参考方案9】:
ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)

【讨论】:

【参考方案10】:

文件中搜索子字符串的解决方案也可以搜索字符串,例如。 findfindstr. 在您的情况下,简单的解决方案 是将字符串通过管道传输到命令中,而不是提供文件名,例如。

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

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

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

【讨论】:

【参考方案11】:

以@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】:

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

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

【讨论】:

以上是关于批处理文件:查找子字符串是不是在字符串中(不在文件中)的主要内容,如果未能解决你的问题,请参考以下文章

批处理:在字符串中查找带引号的子字符串

c++ 文本文件中查找字符串

如何在文件中查找子字符串?

使用c ++从由字符串组成的文件中查找所有可能的公共子字符串

查找和替换文件中与另一个文件中的字符串匹配的子字符串

如果特定字符串不在文本文件中,则返回 False