2011-08-10 55 views
148

在批處理文件中,我有一個字符串abcdefg。我想檢查bcd是否在字符串中。批處理文件:查找子串是否在字符串中(不在文件中)

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

有沒有簡單的解決方案呢?

+3

順便說一句,它通常是'Windows'和'cmd'或者它是'ms-dos'。 MSDOS在很長一段時間內還沒有成爲Windows的一部分。 – paxdiablo

回答

207

是的,你可以使用替換和核對原始字符串:

if not x%str1:bcd=%==x%str1% echo It contains bcd 

%str1:bcd=%位將在str1用一個空字符串替換bcd,使其從原來的不同。

如果原始文件中不包含bcd字符串,則修改後的版本將相同。

測試與下面的腳本將顯示它在行動:

@setlocal enableextensions enabledelayedexpansion 
@echo off 
set str1=%1 
if not x%str1:bcd=%==x%str1% echo It contains bcd 
endlocal 

及各種運行的結果:

c:\testarea> testprog hello 

c:\testarea> testprog abcdef 
It contains bcd 

c:\testarea> testprog bcd 
It contains bcd 

有兩點要注意:

  • if聲明是這個解決方案的肉,其他一切都是支持的東西。
  • x之前雙方的平等是保證字符串bcd的作品行不行。它還可以防止某些「不正確的」起始字符。
+0

這是完美的(並給我一些閱讀要做)。萬分感謝! +1的解釋也省了我一些閱讀heheh。 – Ben

+6

如果您正在尋找如何在FOR循環中執行字符串替換:http://stackoverflow.com/a/6310580/623622 –

+0

很好的解釋。如果只有所有批處理文件的建議是這樣的好! –

93

您可以將源字符串傳送到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 
) 

當這是在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 
+7

+1支持正則表達式 –

+1

就我個人而言,除了支持更高級的比較之外,我發現這更容易編寫和讀取!謝謝你的提示! –

+0

「FINDSTR:在/ C。找不到一個模式後找不到參數」 –

32

我平時做這樣的事情:

Echo.%1 | findstr /C:"%2">nul && (
    REM TRUE 
) || (
    REM FALSE 
) 

例子:

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

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

輸出:

TRUE 
FALSE 

我不知道這是否是最好的方法。

+2

這是唯一對我有用的解決方案。 – Phil

+0

我需要遞歸查找和比較文件名。這是對我來說唯一的解決方案!超級方便,非常簡單。 – SirJames

11

爲了兼容性和易用性,通常最好使用FIND來執行此操作。

您還必須考慮您是否想要區分大小寫或不區分大小寫。

78點的方法(我相信我指的是paxdiablo的帖子)只會匹配Case敏感性,因此您必須對每個可能的迭代進行單獨檢查以找到每個可能需要匹配的迭代。

(什麼疼痛!在只有3個字母,這意味着9次不同的測試,以實現檢查!)

此外,許多倍,優選以匹配命令輸出,在一個循環中的變量,或批/ CMD中指針變量的值不那麼簡單。

由於這些原因,這是一個優選的替代方法:

使用:查找[/ I] [/ V] 「字符到匹配」

[/ I](不區分大小寫) [/ V ](必須不包含字符)

如單線:

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

多線:

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

如前所述,這是偉大的事情是不變量,方便字符串替換,以及:

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

輸出命令:

NLTest | FIND /I "ABC">Nul && (Echo.Found "ABC") || (Echo.Did not find "ABC") 

正如你可以看到這是優越的方式來處理多種原因的檢查。

+0

出於區分大小寫的問題,您可以使用'setlocal EnableExtensions'然後'IF/I'來進行不區分大小寫的比較。 – cychoi

+0

這不是一個真正的選擇,因爲您仍然需要隔離「IF」比較的字符。 IF在「Like」條款中不匹配,因爲OP和我回復的特定解決方案正在尋找。 –

+0

嗨Ben,請不要以他們擁有的點數引用其他答案。這很可能會改變。請根據該答案的作者姓名或其他答案更新答案,或通過描述該答案中使用的技巧的簡短短語更新答案。 – phonetagger

5

如果您對檢測存在,這裏是最簡單的解決方案:

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

這個偉大的工程爲下降窗口命令的輸出到一個布爾變量。只需用你想運行的命令替換回顯。您還可以將Findstr串起來,以使用管道進一步限定語句。例如。對於服務控制(SC.exe的)

SC QUERY WUAUSERV | findstr /C:"STATE" | FINDSTR /C:"RUNNING" & IF ERRORLEVEL 1 (ECHO case True) else (ECHO CASE FALSE) 

即一個評估SC查詢的窗戶更新服務,其輸出出來作爲多行文本,查找包含「狀態」,然後發現如果「跑」的字線發生在該行上,並相應地設置錯誤級別。

+3

你有你的IF聲明落後..用abcdefg看你的原文,你觸發你的邏輯。有用。你擁有它的方式並非如此。'SET STRING = abcdefgh SET SUBSTRING = bcd ECHO%STRING%| FINDSTR/C:「%SUBSTRING%」> nul&IF ERRORLEVEL 1(ECHO CASE FALSE)else(ECHO CASE TRUE)' – Leptonator

+1

即使@Leptator與反邏輯是正確的,這是一個簡單易用的解決方案。 –

相關問題