回答:
はい、置換を使用して、元の文字列と照合できます。
if not x%str1:bcd=%==x%str1% echo It contains bcd
%str1:bcd=%
ビットが置き換えられますbcd
でstr1
、元からそれは違う作り、空の文字列を持ちます。
オリジナルに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の投稿を参照していたと思います)は大文字と小文字を区別してのみ一致するため、一致する可能性のあるすべての反復について、ケースのバリエーションごとに個別のチェックを行う必要があります。
(なんて面倒なことだろう。たった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 (
"Some long string with Spaces does not contain the expected string"
oihu AljB
lojkAbCk
Something_Else
"Going to evaluate this entire string for ABC as well!"
) DO (
ECHO.%~A| FIND /I "ABC">Nul && (
Echo.Found "ABC" in "%A"
) || ( Echo.Did not find "ABC" )
)
Output From a command:
NLTest | FIND /I "ABC">Nul && ( Echo.Found "ABC" ) || ( Echo.Did not find "ABC" )
As you can see this is the superior way to handle the check for multiple reasons.
setlocal EnableExtensions
then IF /I
を使用して大文字と小文字を区別しない比較を行うことができます。
存在を検出している場合、最も簡単な解決策は次のとおりです。
SET STRING=F00BAH
SET SUBSTRING=F00
ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE TRUE) else (ECHO CASE FALSE)
これは、Windowsコマンドの出力をブール変数にドロップするのに最適です。エコーを実行したいコマンドに置き換えるだけです。Findstrの文字列を組み合わせて、パイプを使用してステートメントをさらに修飾することもできます。EG for Service Control(SC.exe)
SC QUERY WUAUSERV | findstr /C:"STATE" | FINDSTR /C:"RUNNING" & IF ERRORLEVEL 1 (ECHO case True) else (ECHO CASE FALSE)
これは、複数行のテキストとして出力されるWindows UpdateサービスのSCクエリの出力を評価し、「state」を含む行を見つけて、その行に「running」という単語が含まれているかどうかを確認し、それに応じてエラーレベルを設定します。
SET STRING=abcdefgh SET SUBSTRING=bcd ECHO %STRING% | FINDSTR /C:"%SUBSTRING%" >nul & IF ERRORLEVEL 1 (ECHO CASE FALSE) else (ECHO CASE TRUE)
より良い答えがここにありました:
set "i=hello " world"
set i|find """" >nul && echo contains || echo not_contains
Windows
とcmd
か、それですms-dos
。MSDOSは長い間 Windowsの一部ではありませんでした。