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

问题描述:

假设我在一个名为$ 1的变量中有一些文本。现在我想检查$ 1是否包含某个字符串。如果它包含某个字符串,我想打印一条消息。印刷不是问题,问题是检查...想法如何做到这一点?检查批处理文件(Windows)中子字符串的字符串?

+1

从这里开始:http://www.dostips.com/DtTipsStringManipulation.php – 2012-01-06 11:03:08

+0

谢谢!没有真正的帮助...我希望有更容易的事情。任何其他想法? – EOB 2012-01-06 11:32:29

据我所知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

注 - 此类搜索不区分大小写。也可以有特殊字符的问题。在搜索/替换和相等性检查中使用延迟扩展时,它更加健壮。但搜索字符串不能包含'='char,搜索字符串不能以'〜'或'*'开头。 – dbenham 2012-01-06 13:02:23

+0

@dbenham:绝对公平的评论,我的解决方案远非完美(尽管是cmd语法)。 – 2012-01-06 13:16:38

所设置的搜索在很多情况下取代招的作品,但它不支持区分大小写正则表达式搜索。

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

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

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

如果FINDSTR发现搜索字符串,它将回显$ 1 - 您不希望这样会将输出重定向到nul。如果找到搜索字符串,则FINDSTR将ERRORLEVEL设置为0;如果未找到,则FINDSTR设置为1。这是用来检查字符串是否被找到。 &&||是用于测试匹配(ERRORLEVEL 0)或不匹配(ERRORLEVEL不是0)的便捷语法。

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

查看FINDSTR /?获取更多信息。

此正则表达式示例将在字符串开始处搜索“BEGIN”$ 1,中间任何位置的“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 
) 

在我看来,最简单的方法是这样的:

set YourString=This is a test 

If NOT "%YourString%"=="%YourString:test=%" (
    echo Yes 
) else (
    echo No 
) 

Basiclly后的字符串“:”是字符串您正在寻找与您正在使用不盈方如果因为%字符串: * %将从字符串中删除*使它们不相等。

+2

与[Igor的回答](http://*.com/a/8757658/1012053)一样,这个测试忽略了大小写。此外,使用延迟扩展更安全。最后,如果子字符串包含'=',则不能使用它。 – dbenham 2015-07-30 14:52:08