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

Ben*_*Ben 188 windows cmd substring batch-file

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

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

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

pax*_*blo 273

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

if not x%str1:bcd=%==x%str1% echo It contains bcd
Run Code Online (Sandbox Code Playgroud)

%str1:bcd=%位将用空字符串替换bcdin str1,使其与原始字符串不同.

如果原始文件中没有包含bcd字符串,则修改后的版本将完全相同.

使用以下脚本进行测试将显示它的运行情况:

@setlocal enableextensions enabledelayedexpansion
@echo off
set str1=%1
if not x%str1:bcd=%==x%str1% echo It contains bcd
endlocal
Run Code Online (Sandbox Code Playgroud)

各种运行的结果:

c:\testarea> testprog hello

c:\testarea> testprog abcdef
It contains bcd

c:\testarea> testprog bcd
It contains bcd
Run Code Online (Sandbox Code Playgroud)

几个笔记:

  • if声明是该解决方案的肉,其他的都是支持的东西.
  • x平等的双方之前是要确保字符串bcd工作好.它还可以防止某些"不正当"的起始角色.

  • 这很好,但是当搜索值不是常量(如bcd)而是变量时,我努力让它工作.经过很长时间我终于明白了.假设已经声明了searchVal,"x!str1:%searchVal%=!"=="x%str1%" (53认同)
  • 如果您正在寻找如何在FOR循环中进行字符串替换:http://stackoverflow.com/a/6310580/623622 (7认同)
  • @Gary,因为这不是这个问题的要求之一,你可能应该问一个不同的问题,也许可以链接回这个作为参考.不乏愿意帮忙的人.事实上,你仍然要问这个问题并自己回答(现在你已经弄明白了),这样对未来的搜索者来说这将是有用的.自我回答被认为是可以接受的. (6认同)
  • 非常好的解决方案,但您需要用双引号括起来,否则它将无法使用其值中包含空格的变量,例如:如果不是"x%str1:bcd =%"=="x%str1%"echo it包含bcd (5认同)
  • "'= str1此时出人意料" (4认同)
  • @BeritLarsen,值得提供一个测试用例,你会得到你引用的错误,因为显示的代码与OP的测试数据非常吻合.我注意到你对另一个答案做了同样的事情,引用了绝对零上下文或解释的一些错误.没有它,你可能只是说"烤宽面条":-) (2认同)
  • *延迟扩展*是其工作的必要条件吗?我正在使用该语句来设置变量,并且我想在 *setlocal* 代码之外访问这些变量。我有一个办法可以做到这一点,但它很笨重。 (2认同)
  • 请注意,此方法不区分大小写。`(set a = b)&&(echo%a:B = insensitive%)`在Win10上对我不敏感。 (2认同)

gho*_*g74 102

您可以将源字符串传递给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
)
Run Code Online (Sandbox Code Playgroud)

当这在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
Run Code Online (Sandbox Code Playgroud)


use*_*791 43

我通常做这样的事情:

Echo.%1 | findstr /C:"%2">nul && (
    REM TRUE
) || (
    REM FALSE
)
Run Code Online (Sandbox Code Playgroud)

例:

Echo.Hello world | findstr /C:"world">nul && (
    Echo.TRUE
) || (
    Echo.FALSE
)

Echo.Hello world | findstr /C:"World">nul && (Echo.TRUE) || (Echo.FALSE)
Run Code Online (Sandbox Code Playgroud)

输出:

TRUE
FALSE
Run Code Online (Sandbox Code Playgroud)

我不知道这是不是最好的方法.

  • 这是唯一对我有用的解决方案. (2认同)

Ben*_*ick 19

为了兼容性和易用性,使用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" )
Run Code Online (Sandbox Code Playgroud)

多行:

ECHO.%Variable%| FIND /I "ABC">Nul && ( 
  Echo.Found "ABC"
) || (
  Echo.Did not find "ABC"
)
Run Code Online (Sandbox Code Playgroud)

如上所述,这对于那些不允许字符串替换的变量的内容非常有用:

FOR %A IN (oihu AljB lojkAbCk) DO ( ECHO.%~A| FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" ) )
Run Code Online (Sandbox Code Playgroud)

从命令输出:

NLTest | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" )
Run Code Online (Sandbox Code Playgroud)

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

  • 嗨,本,请不要根据他们的分数来参考其他答案。这很可能会改变。请通过该答案的作者姓名或描述该答案中使用的技术的简短短语更新您的答案。 (2认同)

小智 9

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

SET STRING=F00BAH
SET SUBSTRING=F00
ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE TRUE) else (ECHO CASE FALSE)
Run Code Online (Sandbox Code Playgroud)

这非常适合将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)
Run Code Online (Sandbox Code Playgroud)

那个评估SC查询的Windows更新服务的输出,它作为多行文本出现,找到包含"state"的行,然后查找该行上是否出现"running",并相应地设置errorlevel.

  • 你有你的IF语句落后..用abcdefg查看原文,你翻转你的逻辑.有用.你拥有它的方式,它没有.`SET STRING = abcdefgh SET SUBSTRING = bcd ECHO%STRING%| FINDSTR/C:"%SUBSTRING%"> nul&IF ERRORLEVEL 1(ECHO CASE FALSE)否则(ECHO CASE TRUE) (6认同)
  • 即使@Leptonator与反转逻辑正确,也会导致+1.这是一个简单易用的解决方案. (2认同)

小智 8

要在 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 " 
    )
Run Code Online (Sandbox Code Playgroud)

传奇:

  1. & 执行那个和执行这个
  2. || 例如: Execute_that IF_FAIL 执行此操作
  3. && 例如: Execute_that IF_SUCCESSFUL 执行此操作
  4. >nul 命令没有回显结果
  5. 查找字符串
  6. /C: 使用字符串作为文字搜索字符串


Kuz*_*ave 6

对我来说最好的方法是:

call :findInString "HelloWorld" "World"

:findInString
ECHO.%1 | FIND /I %2>Nul && ( 
  Echo.Found
) || (
  Echo.Not found
)
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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

SET searchString=abcd1234
SET key=cd123

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

IF NOT "x%keyRemoved%"=="x%searchString%" (
    ECHO Contains.
)
Run Code Online (Sandbox Code Playgroud)

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