web-dev-qa-db-ja.com

バッチファイル:部分文字列が文字列内にあるかどうかを調べます(ファイル内にはありません)。

バッチファイルでは、私は文字列abcdefgを持っています。 bcdが文字列に含まれているかどうかを確認します。

残念ながら、私が見つけているすべての解決策は部分文字列の文字列ではなく、部分文字列のファイルを検索するようです。

これに対する簡単な解決策はありますか?

179
Ben

はい、置換を使用して元の文字列と照合することができます。

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が問題なく機能することを保証するためのものです。また、特定の「不適切な」開始文字からも保護します。
260
paxdiablo

ソース文字列を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
100
ghostdog74

私は通常このようなことをします:

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

これが最善の方法かどうかはわかりません。

41
user839791

互換性と使いやすさのために、これを実行するにはFINDを使用することをお勧めします。

大文字と小文字を区別して一致させるか、大文字と小文字を区別しないで一致させるかについても考慮する必要があります。

78点のメソッド(私はpaxdiabloの投稿を参照していたと思います)は大文字と小文字を区別してのみ一致します。したがって、一致を望む可能性のある反復ごとに、大文字と小文字の変化ごとに個別のチェックを行う必要があります。

(なんて痛い!チェックを達成するためには9つの異なるテストを意味するわずか3文字で!)

さらに、多くの場合、コマンド出力、ループ内の変数、またはバッチ/ 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" )

ご覧のとおり、これはさまざまな理由でチェックを処理するための優れた方法です。

17
Ben Personick

あなたが存在を検出しているならば、これは最も簡単な解決策です:

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

これは、windowsコマンドの出力をブール変数にドロップするのに最適です。エコーを実行したいコマンドに置き換えてください。パイプを使用してステートメントをさらに限定するためにFindstrを一緒にストリングにすることもできます。例えば。サービス制御(SC.exe)用

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

これは、複数行のテキストとして出力されるSC Query for windows update servicesの出力を評価し、 "state"を含む行を見つけ、その行に "running"という単語があるかどうかを調べ、エラーレベルを設定しますそれに応じて。

9
byorking

より良い答えはこちら でした

set "i=hello " world"
set i|find """" >nul && echo contains || echo not_contains
1
T.Todua

私はおそらくこの答えには少し遅すぎますが、受け入れられた答えは「ハードコードされた文字列」が検索文字列の一部であるかどうかをチェックするためだけに機能します。

動的検索の場合は、これを行う必要があります。

SET searchString=abcd1234
SET key=cd123

CALL SET keyRemoved=%%searchString:%key%=%%

IF NOT "x%keyRemoved%"=="x%searchString%" (
    ECHO Contains.
)

注:2つの変数を引数として取ることができます。

1
Andy Sug
ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)
0