(for Internet Explorer)
%0, %1, %2 … の内容を シフトします。%0=%1, %1=%2, %2=%3 …
if exist "%~1"  ( command )
if not exist "%~1"  ( command )
ファイルまたはフォルダーが存在するとき
ファイルまたはフォルダーが存在しないとき
フォルダの中のすべてのファイルのうち、タイムスタンプが 6/12 以降のものを表示する
for /R %%i in (*.*) do  (
    @if "%%~ti" geq "2006/06/12 00:00"  ( echo %%~ni "%%~ti" %%i )
)
>if /?
バッチ プログラム中で条件処理を実行します。

IF [NOT] ERRORLEVEL 番号 コマンド
IF [NOT] 文字列1==文字列2 コマンド
IF [NOT] EXIST ファイル名 コマンド

  NOT               条件が偽の場合にだけ、Windows XP がコマンドを実行する
                    ことを指定します。

  ERRORLEVEL 番号   最後のプログラムの実行で指定された番号以上の終了コード
                    が返されたときに、条件が真になるように指定します。

  文字列1==文字列2  テキスト文字列が一致するときに条件が真になるように指定
                    します。

  EXIST ファイル名  指定したファイル名が存在するときに条件が真になるように
                    指定します。

  コマンド          条件が真のときに実行するコマンドを指定します。コマンドに
                    続けて、ELSE キーワードの後、指定した条件が偽の場合に
                    実行される ELSE コマンドを指定することができます。

ELSE 節は、IF の後のコマンドと同じ行に置きます。
例:

    IF EXIST filename. (
        del filename.
    ) ELSE (
        echo filename. missing.
    )

del コマンドは、改行で終了しなければならないため、次の例は、正しく動作し
ません:

    IF EXIST filename. del filename. ELSE echo filename. missing

ELSE コマンドは、IF コマンドの終わりと同じ行で始まらなければならないため、
次の例は正しく動作しません:

    IF EXIST filename. del filename.
    ELSE echo filename. missing

次の例のように、すべてのコマンドを 1 行にすれば正しく動作します:

    IF EXIST filename. (del filename.) ELSE echo filename. missing

コマンド拡張機能を有効にすると、IF は次のように変更されます:

    IF [/I] 文字列1 比較演算子 文字列2 コマンド
    IF CMDEXTVERSION 番号 コマンド
    IF DEFINED 変数 コマンド

比較演算子は、次のいずれかです:

    EQU - 等しい
    NEQ - 等しくない
    LSS - より小さい
    LEQ - 以下
    GTR - より大きい
    GEQ - 以上

/I スイッチを指定すると、文字列は、大文字と小文字を区別せずに比較され
ます。/I スイッチは、IF の 文字列1==文字列2 形式で使うこともできます。
この比較は汎用であり、文字列1 と 文字列2 が両方とも数字だけを含む場合
は、文字列が数値に変換され、数値の比較が行われます。

CMDEXTVERSION 条件は ERRORLEVEL と同様に動作しますが、コマンド拡張機能
に関連付けられている内部バージョン番号との比較を行います。最初のバー
ジョンは 1 です。コマンド拡張機能に重要な拡張が追加された場合は、値が
1 大きくなります。コマンド拡張機能が無効である場合は、CMDEXTVERSION は
条件は常に偽です。

DEFINED 条件は EXISTS と同様に動作しますが、環境変数名を受け取って、環境
変数が定義されている場合は真を返します。

%ERRORLEVEL% は、ERRORLEVEL の現在の値の文字列表記に展開されます。
ただし、ERRORLEVEL という名前の環境変数が既に定義されている場合は、その
環境変数の値が取得されます。プログラム実行後、次の例が ERRORLEVEL の使い方
を説明しています:

    goto answer%ERRORLEVEL%
    :answer0
    echo Program had return code 0
    :answer1
    echo Program had return code 1

また、上の数値比較を使うこともできます:

    IF %ERRORLEVEL% LEQ 1 goto okay

%CMDCMDLINE% は、CMD.EXE が処理する前の、CMD.EXE に渡されたオリジナル
のコマンド ラインに展開されます。ただし、CMDCMDLINE という名前の環境変数
が既に定義されている場合は、その環境変数の値が取得されます。

%CMDEXTVERSION% は、CMDEXTVERSION の現在の値の文字列表記に展開されます。
ただし、CMDEXTVERSION という名前の環境変数が既に定義されている場合は、その
環境変数の値が取得されます。
C:\home\SVGCats_src\spec_test\workspace>
if "%~1" == "A"  ( command )
if 56 lss 123  ( command )
equ : =(等しい)
neq : ≠(等しくない)
lss : <(より小さい)
leq : ≦(以下)
gtr : >(より大きい)
geq : ≧(以上)
数字だけのときは、
数値として 56 < 123 (真)
文字の比較
if "56" gtr "123"  ( command )
"" で囲むと文字として比較
"56" > "123" (真)
ここで書かれているものは、
Windows 2000/Xp 以降専用のものがあります。
ヘルプ
if /I "%~1"=="A"  ( command )
大文字小文字を区別しない
if not exist "%ProgramFiles%\prog\prog.exe"  (
    echo prog を Program Files に入れてください & goto :eof )
プログラムが入っていなかったら、メッセージを出して、バッチを終える。
if (%~1)==(A)  ( command )
囲むのは "" でなくてもよい
  if exist "a.txt" (
    echo OK
  )
if not exist "%~1"  ( echo Not found "%~1"& goto :eof )
サンプル
if exist "a.txt" (
    echo OK
) else (
    echo NG
)
( ) を使うと、( ) の中で値を代入した環境変数を、同じ ( ) の中で参照できません。
を使えば参照できますが、Windows10でも cmd.exe を起動するときに、/V:ON オプション
が必要です。 ただし、/V:ON オプションを指定すると ! をファイル名や変数の値に使えなくなる副作用
があります。
if exist "a.txt" (
    set return_value=Exist
        @set next=0
) else (
    set return_value=NotExist
        @set next=1
        )
        @if "%next%" == "1" (
    set return_value=%return_value%!
)
echo %return_value%
    rem // echo Exist or NotExist!
pause
次のように、if ブロックを分ければ、前のブロックで代入した値を、後のブロックで参照できます。
1つ目の if の後、2つ目の if の前に & を書いて1つの行にしてしまうと、
( ) の中の複数行と同様に、代入する前の値を参照してしまいます。
if exist "." (
    set return_value=Exist
        @set next=1
        ) else ( set next=0 )
        @if "%next%" == "1" (
    set return_value=%return_value%!
) else (
    set return_value=NotExist
)
echo %return_value%
    rem // echo Exist! or NotExist
pause
if exist "C:\a.txt" (
    set return_value=OK
) else (
    set return_value=NG
    set return_value_2=%return_value%
)
たとえば、下記の return_value_2 に設定する値は、すぐ上で代入する前の return_value の値になります。
真の場合でブロックを分けるとき
偽の場合でブロックを分けるとき
        @set next=1
        ) else ( set next=0 )
        @if "%next%" == "1" (
        @set next=0
        @set next=1
        )
        @if "%next%" == "1" (
上記の真の場合と偽の場合の両方の赤い部分をそのまま記述しても期待通り動作します。
    set return_value_2=%return_value%
  if exist "a.txt" (
    echo OK )
  if exist "a.txt" ( echo OK )
if exist "a.txt" ( echo OK ) else ( echo NG )
関連
関連
goto :eof
バッチファイルを終了します。 call 元へ戻ります。
goto :L1

:L1
for /F "tokens=1-3 delims=/ " %%i in ('date /t') do SET DT=%%a%%b%%c


「in セット」の各要素に対して、指定された「do コマンド」を実行します。


FOR [オプション] %変数|%%変数 IN (セット) DO コマンド [コマンドパラメータ]

  %変数     単一文字の置き換え可能な変数名を指定します。大文字小文字区別。
            コマンドライン例:%i、バッチファイル例:%%i
  (セット)  オプションによって変わります。ファイル セットならワイルドカードできます。
  コマンド  各ファイルごとに実行するコマンドを指定します。
  コマンドパラメータ
            指定されたコマンドのパラメータまたはスイッチを指定します。



コマンド拡張機能を有効にすると、次の FOR コマンドの追加形式がサポートされる
ようになります:


[ディレクトリ]
FOR /D %変数 IN (セット) DO コマンド [コマンドパラメータ]

    セットがワイルドカードを含む場合は、ファイル名ではなくディレクトリ名
    の一致を指定します。
    サブディレクトリを再起検索しません


[サブディレクトリ]
FOR /R [[ドライブ:]パス] %変数 IN (セット) DO コマンド [コマンドパラメータ]

    [ドライブ:]パスから始めて、ツリーの各ディレクトリで FOR 文を実行し
    ます。/R の後にディレクトリが指定されていない場合は、現在の
    ディレクトリが使用されます。セットが単一のピリオド (.) である場合は、
    ディレクトリ ツリーの列挙だけを行います。

    例: for /R %%i in (build.log) do echo %%i
         %%i には、サブディレクトリのそれぞれに、build.log を付けたものが入ります。

    例: for /R %%i in (build*) do echo %%i
         カレントかサブディレクトリに、build から始まるファイルがあれば、%%i に入ります。

    例: for /R %%i in (build.log) do if exist %%i echo %%i
         カレントかサブディレクトリに、build.log のファイルがあれば、echo します。


[数値]
FOR /L %変数 IN (開始,ステップ,終了) DO コマンド [コマンドパラメータ]

    セットは、ステップの量ごとに変化する開始から終了までの数列です。
    たとえば、(1,1,5) は 1 2 3 4 5、(5,-1,1) は (5 4 3 2 1) という数列に
    なります。


[ファイル][文字列][コマンド出力]
FOR /F ["オプション"] %変数 IN (ファイル セット) DO コマンド [コマンド パラメータ]
FOR /F ["オプション"] %変数 IN ("文字列") DO コマンド [コマンド パラメータ]
FOR /F ["オプション"] %変数 IN ('コマンド') DO コマンド [コマンド パラメータ]

    または usebackq オプションの場合:

FOR /F ["オプション"] %変数 IN (ファイル セット) DO コマンド
       [コマンド パラメータ]
FOR /F ["オプション"] %変数 IN ('文字列') DO コマンド [コマンド パラメータ]
FOR /F ["オプション"] %変数 IN (`コマンド`) DO コマンド [コマンド パラメータ]

    ファイル名セットは、1 つ以上のファイル名です。各ファイルが開かれ、読み
    取られ、処理されてから、ファイル名セットの次のファイルに進みます。処理
    には、ファイルの読み取り、個々のテキスト行への分割と、0 個以上のトークン
    への解析が含まれます。その後、変数値を見つかったトークン文字列に設定して、
    for ループの本体が呼び出されます。既定では、/F は、各ファイルの各行から、
    空白で区切られた最初のトークンを渡します。空白行はスキップされます。既定
    の解析動作を変更するには、オプションの "オプション" パラメータを指定しま
    す。これは、異なる解析オプションを指定する 1 つ以上のキーワードを含む、
    引用符で囲まれた文字列です。キーワードは、次のとおりです:

        eol=c           - 行末のコメント文字を指定します (1 文字)。
        skip=n          - ファイルの先頭でスキップする行数を指定します。
        delims=xxx      - 区切り文字のセットを指定します。これは、既定の
                          区切り文字であるスペースとタブを置き換えます。
        tokens=x,y,m-n  - 各繰り返しに対して、各行から for 本体に渡すトー
                          クンを指定します。これにより、追加の変数名が割り当
                          てられます。m-n の形式は範囲で、m 番目から n 番目の
                          トークンを指定します。tokens= 文字列の最後の文字が
                          アスタリスクである場合は、追加の変数が割り当てられ、
                          最後のトークンが解析された後、行に含まれている残り
                          のテキストを受け取ります。
        usebackq        - 次の新しい表示形式を指定します。逆引用符で囲まれた
                          文字列がコマンドとして実行され、一重引用符で囲まれた
                          文字列がリテラル文字列コマンドになりファイル名セット
                          のファイル名を二重引用符で囲めるようになります。

    例:

    FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k


    この例は、myfile.txt の各行を解析します。セミコロンで始まる行を無視し、
    各行の 2 番目と 3 番目のトークンを for 本体に渡します。トークンは、カンマ
    またはスペースで区切られています。for 本体の文が %i で 2 番目のトークン
    を、%j で 3 番目のトークンを取得し、%k で 3 番目以降のすべてのトークンを
    取得していることに注意してください。スペースを含むファイル名に対しては、
    二重引用符でファイル名を引用する必要があります。この方法で二重引用符を使う
    ためには、usebackq オプションを使わなければなりません。使わなければ、二重
    引用符はリテラル文字列の定義として解釈され、解析されます。

    %i は for 文で明示的に宣言され、%j と %k は tokens= オプションで暗黙的に
    宣言されています。tokens= 行を使って 26 個までのトークンを指定できますが、
    文字 'z' または 'Z' よりも高い変数を宣言することはできません。FOR 変数名は
    単一の文字で、大文字と小文字を区別し、グローバルなものであり、一度にアクティ
    ブにできるのは合計 52 個までです。

    また、カッコで囲んだファイル名セットを一重引用符で囲み、文字列にすることに
    より、即時の文字列に対する FOR /F 解析ロジックを使うこともできます。
    これは、ファイルからの単一入力行として処理されます。

    最後に、FOR /F コマンドを使って、コマンド出力を解析することができます。
    カッコの中のファイル名セットを逆引用符で囲みます。この文字列は、コマンド
    ラインとして子 CMD.EXE に渡されます。出力はメモリにキャプチャされ、ファイ
    ルのように解析されます。

    例:

      FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i

    この例は、現在の環境の環境変数名を列挙します。


また、FOR 変数参照の置換も拡張されました。
次のオプション構文を使うことができます:

バッチファイルでは、 %I は %%I になります。
    %I          - ファイルのフルパス                   "c:\folder\file.txt"
    %~I         - すべての引用句 (") を削除して、I を展開します。  "c:\folder\file.txt"
    %~fI        - %I を完全修飾パス名に展開します。    "c:\folder\file.txt"
    %~dI        - %I をドライブ文字だけに展開します。  "c:"
    %~pI        - %I をパス名だけに展開します。        "\folder\"
    %~nI        - %I をファイル名だけに展開します。    "file"
    %~xI        - %I をファイル拡張子だけに展開します。".txt"
    %~sI        - 展開されたパスは短い名前だけを含みます。 "c:\folde~1\file~1.txt"
    %~aI        - %I をファイルの属性に展開します。     "--a------"
    %~tI        - %I ファイルの日付/時刻に展開します。  "2006/03/15 00:35"
    %~zI        - %I ファイルのサイズに展開します。     "283120"
    %~$PATH:I   - PATH 環境変数に指定されているディレクトリを
                  検索し、最初に見つかった完全修飾名に %I を
                  展開します。
                  環境変数名が定義されていない場合、または検索
                  してもファイルが見つからなかった場合は、この
                  修飾子を指定すると空の文字列に展開されます。




修飾子を組み合わせて、複合結果を得ることもできます:

    %~dpI       - %I をドライブ文字とパスだけに展開します。  "\folder\file"
    %~nxI       - %I をファイル名と拡張子だけに展開します。  "file.txt"
    %~fsI       - %I を完全なパスと短い名前だけに展開します。
    %~dp$PATH:I - PATH 環境変数に指定されているディレクトリを
                  検索して %I を探し、最初に見つかったファイル
                  のドライブ文字とパスだけに展開します。
    %~ftzaI     - %I を DIR コマンドの出力行のように展開します。

上の例の %I と PATH は、ほかの有効な値で置き換えることができます。
%~ 構文は、有効な FOR 変数名によって区切られます。%I のような大
文字の変数を使うと読み取りやすく、大文字と小文字を区別しない修飾子
との混乱を避けることができます。

「コマンド拡張機能を有効 にする(Xpではデフォルト)。/e:on
for /R %%i in (a.log) do @if exist "%%i" echo "%%i"
for /R %%i in (*.*) do echo  1 %%i 2 %%~i 3 %%~fi 4 %%~di 5 %%~pi 6 %%~ni 7 %%~xi
 8 %%sfi 9 %%~ai 1 %%~ti 2 %%~zi
%I と %i は異なります。
下記は /R ありのときです。
/R なしでは、%I はファイル名だけ。
相対パスは得られません。
( ) の中にワイルドカードがあれば、ファイルまたはフォルダーがあるもののみマッチします。
( ) の中にワイルドカードが無ければ、ファイルの有無に関係なく全サブフォルダとマッチします。
/R はサブ フォルダー、/D はディレクトリのみ。
( ) の中に、絶対パスを指定することもできますが、/R を指定してもサブ フォルダーにマッチしません。
サブ フォルダーにもマッチさせたいときは、カレント フォルダーをそのフォルダーに移動して、ファイル名
またはフォルダー名を ( ) の中に指定してください。

%%i は、コマンドラインでは %i、バッチファイルでは %%i
%%i は、空白を含んだパスでも "" で囲まれていません。
%%i は、for /R  オプションがあると、フル パスになり、無いと、ファイル名だけになります。
pushd ..
for /R %%i in (readme.txt) do (
  if exist "%%i" (
    echo %%i
    if errorlevel 1 goto exit_for1
  )
)
:exit_for1
echo.
echo done in %cd%
echo.
popd
関連
親フォルダの全サブフォルダにある readme.txt ファイルのパスを一覧する
set src_name=readme.txt
set src=folderX\%src_name%
pushd ..
for /R %%i in (%src_name%) do (
  if exist "%%i" if not "%cd%\%src%"=="%%i" (
    fc "%src%" "%%i"
    if errorlevel 1 goto exit_for1
  )
)
:exit_for1
echo.
echo done in %cd%
echo.
popd
set src_name=
set src=
..\folderX\readme.txt と、それ以外の readme.txt ファイルを比較する
%%~ni%%~xi
%%~di%%~pi
for /D /R %%i in (*) do @if exist "%%i" echo "%%i"
( ) を使うと、( ) の中で値を代入した環境変数を、同じ ( ) の中で参照できません。
ヘルプ表示
サンプル
サンプル
関連
    for /D /R %%i in (*) do (
        set return_value=%%i
        set return_value_2=%return_value% !
    )
    set return_value=%return_value% !
たとえば、下記の return_value_2 に設定する値は、すぐ上で代入する前の return_value の値になります。
        set return_value_2=%return_value%
次のように、for ブロックの中から call すれば、ブロックの外に出すことができ、代入した値をすぐに
参照できます。
:ExampleFunction
    for /D /R %%i in (*) do (
        call :ExampleFunction_Sub  "%%i"
    )
    set return_value=%return_value%
goto :eof

:ExampleFunction_Sub
    set return_value=%~1
    set return_value=%return_value% !
goto :eof
        call :ExampleFunction_Sub  "%%i"
%~1
FC [/A] [/C] [/L] [/LBn] [/N] [/OFF[LINE]] [/T] [/U] [/W] [/nnnn]
   [ドライブ1:][パス1]ファイル名1 [ドライブ2:][パス2]ファイル名2
FC /B [ドライブ1:][パス1]ファイル名1 [ドライブ2:][パス2]ファイル名2

  /A         相違する各部分の 1 行目と最後の行だけを表示します。
  /B         バイナリの比較を実行します。
  /C         英字の大文字と小文字を区別しません。
  /L         ファイルを ASCII テキストとして比較します。
  /LBn       連続する最大不一致行を指定行数に設定します。
  /N         ASCII の比較で行番号を表示します。
  /OFF[LINE] オフライン属性が設定されたファイルをスキップしません。
  /T         タブをスペースに変換しません。
  /U         Unicode テキスト ファイルとしてファイルを比較します。
  /W         連続した空白 (タブとスペース) を 1 つのスペースに圧縮して比較
             します。
  /nnnn      不一致発見後に確認する、一致すべき連続行数を指定します。

  [ドライブ1:][パス1]ファイル名1
             比較する最初のファイルまたはファイル セットを指定します。
  [ドライブ2:][パス2]ファイル名2
             比較する 2 番目のファイルまたはファイル セットを指定します。
fc  text1.txt  text2.txt
テキストファイルやバイナリファイルを比較します。
C:\>fc text1.txt text2.txt
ファイル text1.txt と text2.txt を比較しています
FC: 相違点は検出されませんでした
エラーレベル: 0=一致、1=不一致, 2=text1.txt か text2.txt が無い
C:\>fc text1.txt text2.txt
ファイル text1.txt と text2.txt を比較しています
***** text1.txt
Test Start
==========================================================
***** text2.txt
 Test Start
==========================================================
*****
一致するときの出力例:
一致しないときの出力例:
ヘルプ
fc T_ALL_ans.txt T_ALL_log.txt
echo.>> T_ALL_log.txt
echo Test log compare is ...>> T_ALL_log.txt
if not errorlevel 1 echo Pass.>> T_ALL_log.txt
if     errorlevel 1 echo Fail.>> T_ALL_log.txt
start notepad T_ALL_log.txt
バッチファイルサンプル:
比較して


その結果を出力して

出力結果を開いています。
参考
comp  bin1.txt  bin2.txt
テキストファイル、またはバイナリファイルを比較します。
echo n | ( comp  "1\A\a.txt"  "1\B\a.txt" > nul 2> nul )
echo %errorlevel%
サンプル
同じならエラーレベルが 0、ファイルの内容が異なるなら 1、
ファイルが存在しないなら 2 になります。
find "keyword" file.txt > found_file.txt
def
gis
acd
------------ FILT.TXT
gis
file.txt
found_file.txt
find "is"
ファイル (複数可) 内のテキスト文字列を検索します。

FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "文字列" [[ドライブ:][パス]ファイル名[...]]

  /V        指定した文字列を含まない行をすべて表示します。
  /C        指定した文字列を含む行の数だけを表示します。
  /N        行番号を表示します。
  /I        大文字と小文字の区別をしないで検索します。
  /OFF[LINE] オフライン属性が設定されたファイルをスキップしません。
  "文字列"  検索する文字列を指定します。
  [ドライブ:][パス]ファイル名
            検索するファイル (複数可) を指定します。

パスが指定されていないときは、プロンプトで入力されたテキストまた
は別のコマンドからパイプ処理で渡されたテキストを検索します。
1つのファイルの中を検索します。
UNIXの grep に近い。 findstr もあります。
type file.txt | find "file1" > found_file.txt
パイプを使い、ファイルパスを指定しないと、パイプされた内容から検索します。
find "is"
found_file.txt
file.txt
def
gis
acd
gis
関連
→ find (Linux)
検索する文字列が見つかったときは終了コード0を、
見つからなかったときは終了コード1を返します。
正規表現が使え、サブフォルダーも検索できる find です。
grep とほぼ同じです。 Windows 2000 から使えます。
検索する文字列が見つかったときは終了コード0を、
見つからなかったときは終了コード1を返します。
findstr /S /N /R  "\[PATCH_OF:.*\]"  *
→ grep (Linux)
関連
FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:ファイ
        ル] [/C:文字列] [/G:ファイル] [/D:ディレクトリ一覧] [/A:色属性]
        [/OFF[LINE]] 文字列 [[ドライブ:][パス]ファイル名[ ...]]

  /B           行の先頭にあるパターンを検索します。
  /E           行の末尾にあるパターンを検索します。
  /L           検索文字列をリテラルとして使用します。
  /R           検索文字列を正規表現として使用します。
  /S           現在のディレクトリとすべてのサブディレクトリから一致する
               ファイルを検索します。
  /I           検索するときに大文字と小文字を区別しません。
  /X           完全に一致する行を出力します。
  /V           一致しない行のみを出力します。
  /N           一致する各行の前に行番号を出力します。
  /M           ファイルに一致する行があるときに、ファイル名のみを出力します。
  /O           一致する各行の前に文字オフセットを出力します。
  /P           印刷不可能な文字を含むファイルをスキップします。
  /OFF[LINE]  オフライン属性が設定されたファイルをスキップしません。
  /A:属性      2 桁の 16 進数で色属性を指定します。"color /?" を参照してくだ
               さい。
  /F:ファイル  指定したファイルからファイル一覧を読み取ります (/ を指定する
               とコンソール)。
  /C:文字列    指定された文字列をリテラル検索文字列として使用します。
  /G:ファイル  指定された文字列から検索文字列を取得します (/ を指定する
               とコンソール)。
  /D:ディレクトリ
               セミコロンで区切られた検索されるディレクトリ文字列テキストの
               一覧を検索します。
  [ドライブ:][パス]ファイル名
               検索するファイルを指定します。

複数の文字列を検索する場合には、引数 /C を使わず、各文字列をスペースで区切り
ます。
たとえば、FINDSTR "hello there" x.y と指定した場合は、ファイル x.y で "hello"
または "there" が検索されます。
これに対して、FINDSTR /C:"hello there" x.y と指定した場合はファイル x.y で
"hello there" が検索されます。

正規表現クイック リファレンス:
  .            ワイルドカード: 任意の文字
  *            繰り返し: ゼロ個以上の直前の文字またはクラス
  ^            行位置: 行頭
  $            行位置: 行末
  [class]      文字クラス: セットの任意の 1 文字
  [^class]     逆クラス: セット以外の任意の 1 文字
  [x-y]        範囲: 指定した範囲の任意の文字
  \x           エスケープ: メタ文字 x のリテラル使用
  \<xyz        単語位置: 単語の先頭
  xyz\>        単語位置: 単語の終わり

FINDSTR の詳細な正規表現に関しては、オンライン ヘルプのコマンド リファレンスを
参照してください。
"[PATCH_OF:" から始まり、"]" で終わる文字列を含む行を検索する。
検索対象のファイルは、カレント・フォルダー以下にあるものすべて (*)。
サブフォルダーも探す (/S)、 行番号を出力する (/N)、 正規表現を使う (/R)。
ヘルプ
FolderB\File1.c:51:#define  USES_EXT_FUNC  1
出力例:
サンプル : 正規表現
サンプル : 複数のキーワード、空白を含むキーワード
findstr /S /N /R  "define SYMBOL"  *
"define" または "SYMBOL" を含む行を検索する。
"define SYMBOL" を含む行を検索する。
findstr /S /N /R  /C:"define SYMBOL"  *
findstr /S /N /L "[PATCH_OF:"  *
サンプル
"[PATCH_OF:" を含む行を検索する。
検索対象のファイルは、カレント・フォルダー以下にあるものすべて (*)。
サブフォルダーも探す (/S)、 行番号を出力する (/N)、 リテラル表現を使う (/L)。
FolderB\File1.c:51:  //=== start of insert [PATCH_OF:FuncA]
FolderB\File1.c:53:  //=== end of [PATCH_OF:FuncA]
出力例:
サンプル : 検索対象ファイルの指定
findstr /S /N /L "[PATCH_OF:"  C:\Folder\*
findstr /S /N /L "[PATCH_OF:"  *.txt
C:\Folder フォルダー以下を検索する
拡張子が txt のファイルの中を検索する
+ は使えません。 a+ は、aa* と表現してください。 [ab]+ は、[ab][ab]*。
? は使えません。
{ } を使った量指定子は使えません。
/C オプションを指定しないと、or 検索ができます。
→ 互換性 (正規表現)
findstr /S /N /R  "/C:define SYMBOL"  *
参考
サンプル : 単語単位検索
findstr /S /N  "\<abc\>" *
\< と \> でキーワードを囲みます。 ただし、< と > はリダイレクトの記号なので、
上記のように " " で囲か、\^<abc\^> とする必要があります。
findstr "<abc>" *
似たような指定をしたときの違いをまとめます。
findstr "\<abc\>" *
findstr "abc" *
abc
abcde
<abc>de
<abc>
×
×
×
@echo off
cd /d "C:\Folder"

call :find1  Symbol_1
call :find1  Symbol_2

pause
goto :eof


:find1
echo ======= %1
findstr /S /N /M "\<%1\>" *

goto :eof