检查字符串中的批处理文件中的子字符串(Windows)?

EOB*_*EOB 19 regex string batch-file

假设我在一个名为$ 1的变量中有一些文本.现在我想检查$ 1是否包含某个字符串.如果它包含某个字符串我想打印一条消息.印刷不是问题,问题是检查......想法怎么做?

Wal*_*ald 20

我认为最简单的方法是:

set YourString=This is a test

If NOT "%YourString%"=="%YourString:test=%" (
    echo Yes
) else (
    echo No
)
Run Code Online (Sandbox Code Playgroud)

基本上,':'后面的字符串是你正在寻找的字符串,你使用的不是if if%string:*%将从字符串中删除*使它们不相等.

  • 与[Igor的回答](http://stackoverflow.com/a/8757658/1012053)一样,此测试忽略了大小写.此外,使用延迟扩展更安全.最后,如果子字符串包含`=`,则不能使用它. (2认同)

dbe*_*ham 9

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

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

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

您可以使用ECHO命令将$ 1管道传入FINDSTR命令.用于ECHO($ 1未定义的情况,并注意不要添加额外的空格.如果未定义$ 1,ECHO !$1!则将回显ECHO is off.(或打开),如果未定义,ECHO(!$1!则将回显空行.

如果找到搜索字符串,FINDSTR将回显$ 1 - 您不希望这样,因此您将输出重定向到nul.如果找到搜索字符串,FINDSTR将ERRORLEVEL设置为0,如果未找到,则将其设置为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
)
Run Code Online (Sandbox Code Playgroud)


Igo*_*hov 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
Run Code Online (Sandbox Code Playgroud)