2012-01-06 137 views
18

假設我在一個名爲$ 1的變量中有一些文本。現在我想檢查$ 1是否包含某個字符串。如果它包含某個字符串,我想打印一條消息。印刷不是問題,問題是檢查...想法如何做到這一點?檢查批處理文件(Windows)中子字符串的字符串?

+1

從這裏開始:http://www.dostips.com/DtTipsStringManipulation.php – 2012-01-06 11:03:08

+0

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

回答

2

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

9

所設置的搜索在很多情況下取代招的作品,但它不支持區分大小寫正則表達式搜索。

如果您需要區分大小寫的搜索或有限的正則表達式支持,可以使用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 
) 
16

在我看來,最簡單的方法是這樣的:

set YourString=This is a test 

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

Basiclly後的字符串「:」是字符串您正在尋找與您正在使用不盈方如果因爲%字符串: * %將從字符串中刪除*使它們不相等。

+2

與[Igor的回答](http://stackoverflow.com/a/8757658/1012053)一樣,這個測試忽略了大小寫。此外,使用延遲擴展更安全。最後,如果子字符串包含'=',則不能使用它。 – dbenham 2015-07-30 14:52:08

相關問題