在批处理文件(Windows)中检查字符串是否包含子字符串?

22

假设我有一个名为$1的变量中包含一些文本。现在我想要检查$1是否包含特定的字符串。如果包含特定的字符串,我想要输出一个消息。打印不是问题,问题在于如何进行检查。你有什么想法吗?

假设有一个变量$str存储了要搜索的字符串,可以使用PHP的strpos()函数来检查变量$1是否包含该字符串。如果返回值大于或等于0,则表示字符串存在,否则不存在。
以下是示例代码: ``` if (strpos($1, $str) !== false) { echo "消息"; } ```

1
从这里开始:http://www.dostips.com/DtTipsStringManipulation.php - Ekkehard.Horner
1
谢谢!并没有真正帮助到我...我希望有更简单的方法。还有其他的想法吗? - EOB
3个回答

25

我认为最简单的方法是这样的:

set YourString=This is a test

If NOT "%YourString%"=="%YourString:test=%" (
    echo Yes
) else (
    echo No
)
基本上冒号后面的字符串是你要查找的字符串,而且你在if语句之前使用not是因为% string:* %将从字符串中删除*,使它们不相等。

基本上冒号后面的字符串是你要查找的字符串,而且你在if语句之前使用not是因为%string:*%将从字符串中删除* ,使它们不相等。


4
Igor的回答类似,此测试忽略大小写。此外,最好使用延迟扩展。最后,如果子字符串包含=,则无法使用。 - dbenham
1
我想提供一个例子来说明这里发生了什么。如果你有一个字符串 abc,并且你想要检查是否存在子字符串 b,那么表达式是 not "abc"=="abc:b",它被计算为 not "abc"=="ac"(true)。如果我们在同样的字符串中搜索 x,我们有 not "abc"=="abc"(false),因为 abc:x 不会替换任何符号。 - Dr.eel

12

SET搜索和替换技巧在许多情况下都有效,但它不支持区分大小写或正则表达式搜索。

如果您需要区分大小写的搜索或有限的正则表达式支持,可以使用FINDSTR。

为避免转义特殊字符的复杂性,最好将搜索字符串放在变量中,并通过延迟扩展访问搜索和目标。

您可以使用ECHO命令将$1传输到FINDSTR命令中。如果$1未定义,请使用,并小心不要添加额外的空格。将在$1未定义时回显(或on),而将在未定义时回显一个空行。

FINDSTR会回显$1,如果它找到了搜索字符串-您不希望这样,因此要将输出重定向到nul。 FINDSTR将ERRORLEVEL设置为0,如果找到了搜索字符串,则为1,如果没有找到,则为1。这就是用于检查字符串是否被找到的内容。&&和||是一种方便的语法,用于测试匹配(ERRORLEVEL 0)或不匹配(ERRORLEVEL不是0)。

正则表达式支持非常基本,但仍然有用。

请参阅FINDSTR /?以获取更多信息。

此正则表达式示例将在字符串开头搜索$1的“BEGIN”,在中间任何位置搜索“MID”并在结尾处搜索“END”。默认情况下,搜索区分大小写。

set "search=^BEGIN.*MID.*END$"
setlocal enableDelayedExpansion
echo(!$1!|findstr /r /c:"!search!" >nul && (
  echo FOUND
  rem any commands can go here
) || (
  echo NOT FOUND
  rem any commands can go here
)

这个答案对我帮助很大。虽然我希望它能再有点组织,让我更清楚每个部分的用途。你解释得挺好,只是有一些难以理解。 - Jonathan J. Pecany
好的答案,有一个优点是搜索字符串可以设置为变量(即set "search=something"),这是替换技巧所无法做到的。改进的地方是演示“仅在开头”、“仅在结尾”(我无法使其工作,但它们的用途较少)和“不区分大小写”(只需使用/i开关)。 - undefined

3
据我所知,cmd.exe没有直接回答您问题的内置函数。但是它支持替换操作。因此,诀窍在于:在$1中用空字符串替换需要测试存在的子字符串,然后检查$1是否已更改。如果有更改,则它确实包含该子字符串(否则,替换操作首先就没有要替换的内容!)。请参见下面的代码:
set longString=the variable contating (or not containing) some text

@rem replace xxxxxx with the string you are looking for
set tempStr=%longString:xxxxxx=%

if "%longString%"=="%tempStr%" goto notFound
echo Substring found!
goto end

:notFound
echo Substring not found

:end

1
注意 - 这种搜索不区分大小写。同时会在特殊字符上遇到问题。使用延迟扩展进行搜索/替换和相等性检查更加健壮。但是搜索字符串不能包含 = 字符,且搜索字符串不能以 ~* 开头。 - dbenham
@dbenham:绝对公正的评论,我的解决方案远非完美(命令语法也是如此)。 - Igor Korkhov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接