2012-01-06 10 views
18

$ 1という変数にいくつかのテキストがあるとしましょう。今、$ 1に特定の文字列が含まれているかどうか確認したいと思います。特定の文字列が含まれている場合は、メッセージを印刷します。印刷は問題ではない、問題はチェック...それを行う方法ですか?バッチファイル(Windows)の部分文字列の文字列を確認しますか?

+1

ここから開始:http://www.dostips.com/DtTipsStringManipulation.php –

+0

ありがとう! doesntは本当に助ける...私はsomethiingがより容易であることを望んでいた。他のアイデア? – EOB

答えて

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

+0

@dbenham:確かに公正な発言ですが、私のソリューションは完璧ではありません(cmd構文と同じですが)。 –

9

SET検索をし、多くの場合、トリック作品を交換するが、それは大文字と小文字を区別したり、正規表現検索をサポートしていません。

大文字と小文字を区別した検索や限定された正規表現のサポートが必要な場合は、FINDSTRを使用できます。

特殊文字をエスケープするのを避けるには、検索文字列が変数にあり、検索とターゲットの両方が遅延拡張によってアクセスされる場合が最適です。

ECHOコマンドを使用して、$ 1をFINDSTRコマンドにパイプすることができます。 $ 1が未定義の場合はECHO(を使用し、余分なスペースを入れないように注意してください。 ECHO !$1!は、$ 1が未定義の場合ECHO is off.(またはon)をエコーし​​ますが、未定義の場合はECHO(!$1!が空白行をエコーし​​ます。

FINDSTRは検索文字列が見つかると$ 1をエコーし​​ます。出力をnulにリダイレクトする必要はありません。 FINDSTRは、検索文字列が見つかった場合はERRORLEVELを0に、見つからない場合は1に設定します。これは、文字列が見つかったかどうかを確認するために使用されます。 &&および||は、一致(ERRORLEVEL 0)または一致なし(ERRORLEVEL 0以外)のテストに便利な構文です

正規表現のサポートは基本的ですが、それでも役立ちます。

FINDSTR /?を参照してください。詳細については。

この正規表現の例では、文字列の先頭に "BEGIN"、最後に中間に "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

関連する問題