バッチファイルでは、私は文字列abcdefg
を持っています。 bcd
が文字列に含まれているかどうかを確認します。
残念ながら、私が見つけているすべての解決策は部分文字列の文字列ではなく、部分文字列のファイルを検索するようです。
これに対する簡単な解決策はありますか?
はい、置換を使用して元の文字列と照合することができます。
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
が問題なく機能することを保証するためのものです。また、特定の「不適切な」開始文字からも保護します。ソース文字列を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
私は通常このようなことをします:
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
これが最善の方法かどうかはわかりません。
互換性と使いやすさのために、これを実行するには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" )
ご覧のとおり、これはさまざまな理由でチェックを処理するための優れた方法です。
あなたが存在を検出しているならば、これは最も簡単な解決策です:
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"という単語があるかどうかを調べ、エラーレベルを設定しますそれに応じて。
より良い答えはこちら でした :
set "i=hello " world"
set i|find """" >nul && echo contains || echo not_contains
私はおそらくこの答えには少し遅すぎますが、受け入れられた答えは「ハードコードされた文字列」が検索文字列の一部であるかどうかをチェックするためだけに機能します。
動的検索の場合は、これを行う必要があります。
SET searchString=abcd1234
SET key=cd123
CALL SET keyRemoved=%%searchString:%key%=%%
IF NOT "x%keyRemoved%"=="x%searchString%" (
ECHO Contains.
)
注:2つの変数を引数として取ることができます。
ECHO %String%| FINDSTR /C:"%Substring%" && (Instructions)