(for Internet Explorer)
指定されたプログラムまたはコマンドを実行するためにウィンドウを開きます。

START ["タイトル"] [/Dパス] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/WAIT] [/B] [コマンド/プログラム]
      [パラメータ]

    "タイトル"  ウィンドウのタイトル バーに表示するタイトル。
    パス        開始するディレクトリ。
    B           新しいウィンドウを作成せずにアプリケーションを起動します。
                アプリケーションは Ctrl+C を無視します。
                アプリケーションで Ctrl+C を有効にしていない限り、
                Ctrl+Break がアプリケーションを中断する唯一の方法です。
    /I          新しい環境は、現在の環境ではなく、cmd.exe に渡された元の環境に
                なります。
    /MIN        ウィンドウを最小化の状態で起動します。
    /MAX        ウィンドウを最大表示の状態で起動します。
    /SEPARATE   16 ビットの Windows プログラムを別メモリ領域で起動します。
    /SHARED     16 ビットの Windows プログラムを共有メモリ空間で起動します。
    /LOW        IDLE 優先度クラスでアプリケーションを起動します。
    /NORMAL     NORMAL 優先度クラスでアプリケーションを起動します。
    /HIGH       HIGH 優先度クラスでアプリケーションを起動します。
    /REALTIME   REALTIME 優先度クラスでアプリケーションを起動します。
    /ABOVENORMAL
                ABOVENORMAL 優先度クラスでアプリケーションを起動します。
    /BELOWNORMAL
                BELOWNORMAL 優先度クラスでアプリケーションを起動します。
    /WAIT       アプリケーションを起動し、終了するまで待ちます。
    コマンド/プログラム
                内部コマンドまたはバッチ ファイルの場合、コマンド プロセッサ
                は cmd.exe の /K オプションを使用して実行されます。これは、コ
                マンドの実行の後でもウィンドウが残ることを意味します。
                内部コマンドまたはバッチ ファイルではない場合、そのプログラム
                はウィンドウ モードのアプリケーションまたはコンソール アプリ
                ケーションとして動作します。

    パラメータ  コマンド/プログラムに渡すパラメータです。


コマンド拡張機能を有効にすると、コマンド ラインまたは START コマンドに
よる外部コマンドの起動は、次のように変更されます:

非実行可能ファイルは、ファイル名をコマンドとして入力することによって、
    ファイルの関連付けを使って開くことができます (例:  WORD.DOC は .DOC
    ファイル拡張子に関連付けられているアプリケーションを起動します)。
    コマンド スクリプト内でファイルの関連付けを作成する方法については、
    ASSOC と FTYPE コマンドを参照してください。

32 ビット GUI アプリケーションを実行する場合、CMD.EXE は、アプリケー
    ションの終了を待たずにコマンド プロンプトに戻ります。コマンド スク
    リプト内で実行する場合は、この動作は発生しません。

最初のトークンが拡張子やパス修飾子を持たない文字列 "CMD" であるコマンド
    ラインを実行する場合、"CMD" が COMSPEC 変数の値で置き換えられます。
    これにより現在のディレクトリの CMD.EXE が使われないようにします。

最初のトークンが拡張子を含まないコマンド ラインを実行する場合、CMD.EXE
    は、PATHEXT 環境変数の値を使って拡張子の種類と順序を判断します。
    PATHEXT 変数の既定値は、次のとおりです:

        .COM;.EXE;.BAT;.CMD

    この構文は PATH 変数と同じであり、各要素はセミコロンで区切られて
    いることに注意してください。

実行可能なファイルを検索するときにどの拡張子でも一致するファイルが見つ
からない場合は、拡張子なしの名前がディレクトリ名と一致するかどうかを調
べます。一致する場合は、START コマンドがそのパスでエクスプローラを起動
します。コマンド ラインから実行した場合は、そのパスに対する CD /D の実
行と同じになります。
ヘルプ
start "c:\Program Files\a.exe"
a.exe を実行するのではなく、タイトルになります。
start "title" "c:\Program Files\a.exe"
実行ファイルのパスに空白を含むときは、タイトル指定をする必要があります。
start /WAIT "" "a.exe" param
cd (移動先のパス)
pushd (移動先のパス)
popd
カレントフォルダを移動します。
後で、popd できるように、カレントフォルダを移動します。
pushd を実行したときのカレントフォルダに戻ります。
cd
カレントフォルダを標準出力へ出力します。
set basedir=%cd%
環境変数 basedir に、カレントフォルダを設定します。
cd /d (移動先のパス)
ドライブも移動します。
ディレクトリ中のファイルとサブディレクトリを一覧表示します。

DIR [ドライブ:][パス][ファイル名] [/A[[:]属性]] [/B] [/C] [/D] [/L] [/N]
  [/O[[:]ソート順]] [/P] [/Q] [/S] [/T[[:]タイムフィールド]] [/W] [/X] [/4]

  [ドライブ:][パス][ファイル名]
              一覧表示するドライブ、ディレクトリ、またはファイルを指定します。

  /A          指定された属性のファイルを表示します。
  属性         D  ディレクトリ                R  読み取り専用
               H  隠しファイル                A  アーカイブ
               S  システム ファイル           -  その属性以外
  /B          ファイル名のみを表示します (見出しや要約が付きません)。
  /C          ファイル サイズを桁区切り表示します。これは
              既定の設定です。/-C とすると桁区切り表示されません。
  /D          /W と同じですが、ファイルを列で並べ替えた一覧を表示します。
  /L          小文字で表示します。
  /N          ファイル名を右端に表示する一覧形式を使用します。
  /O          ファイルを並べ替えて表示します。
  ソート順    N  名前順 (アルファベット)     S  サイズ順 (小さいほうから)
              E  拡張子順 (アルファベット)   D  日時順 (古いほうから)
              G  グループ (ディレクトリから) -  降順
  /P          1 画面ごとに停止して表示します。
  /Q          ファイルの所有者を表示します。
  /S          指定されたディレクトリおよびそのサブディレクトリのすべての
              ファイルを表示します。
  /T          どのタイムフィールドを表示するか、または並べ替えに使用するかを
              指定します。
  タイムフィールド    C  作成
                      A  最終アクセス
                      W  最終更新
  /W          ワイド一覧形式で表示します。
  /X          このオプションは MS-DOS 形式以外のファイル名に対する短い名前を
              表示します。長い名前の前に短い名前を表示する点を除けば、
              /N オプションと同じです。短い名前がない場合は、ブランクに
              なります。
  /4          4 つの数字で年を表示します。

環境変数 DIRCMD にスイッチを設定できます。
/-W のように - (ハイフン) を前につけると、そのスイッチは無効になります。
ヘルプ
dir /S /B * > %USERPROFILE%\desktop\_file_list.txt
ファイル一覧を取得する(サブフォルダを含む)
dir /S /AR * > c:\list.txt
読み取り専用ファイルを一覧する(サブフォルダを含む)
ファイルを検索する(サブフォルダを含む)
dir /S /B * | find "name"
キーワードは "" で囲むこと
 /B (ファイル名のみ) は無くてもよい
cd /d "%1"
dir /S * > _list.txt
SendTo バッチ
ファイル名の一覧だけをファイルにする
dir /B * > c:\list.txt
tree /A C:\Folder > %USERPROFILE%\desktop\_tree.txt
フォルダー・ツリーをデスクトップの _tree.txt ファイルに出力する
tree /F /A C:\Folder > %USERPROFILE%\desktop\_tree.txt
… ファイルは含まない
… ファイルも含む
C:\Folder
C:\Folder
DOSのコマンドでリダイレクト記号を使いたい
^ エスケープ文字を使う
@ でコマンドをはじめると、echo on でもエコー出力しません。
nmake の makefile
- でコマンドをはじめるのは
で使えます。
echo ^>
>
echo.
(空行)
(リダイレクトしない)
echo ERROR! >&2
エラー出力へ
pause
続行するには何かキーを押してください . . .
下記のメッセージを表示して、何かキーが押されるまで待ちます。
サンプル
if "%1"=="" pause
別のバッチから実行したときは止まらないようにできる pause
関連
timeout /T 3
下記のメッセージをカウントダウンしながら表示して、指定した秒数(上記なら3秒)が経過するか、
何かキーが押されるまで待ちます。
3 秒待っています。続行するには何かキーを押してください ...
ただし、timeout コマンドは、Windows 7 以降で使えます。
choice /T 3 /C n /D n /M "Wait a minute..."
choice を使った方法は、Windows 7 以降で使えます。 /T に秒数を指定します
VBScript から起動したバッチファイルでの制限事項
timeout コマンドは、無視されます。
choice コマンドは、停止してしまいます。
参考
ping コマンドは使えます。
call :timeout_ 3
goto :eof

:timeout_
echo Waiting %1 seconds ...
ping 1.1.1.1 -n 1 -w %1000 > nul
goto :eof
ping を使った方法は、Windows XP 以降で使えます。 -w にミリ秒を指定します。
ただし、実際に待つ時間は、1秒単位です。
set a=
set /p a=a の値を入力してください^>
echo %a%
ユーザーに任意の文字列を入力させるには、次のようにします。
Enter のみ入力したら、環境変数の値は、今までのままになります。
<, >, | は入力できません。
Windows XP では、choice が使えません。
if "%ROOT%" == "" @echo  not defined ROOT&pause&goto :eof

set SRC=%ROOT%\obj

echo copy binaries.

set out=
set /p out=Root folder of release package^>

if (%out%)==() echo quit.&pause&goto :eof
if ^%out:~0,1% == ^" echo Don't close by ""&pause&goto :eof
if not exist %out% echo not found "%out%"&pause&goto :eof

REM /U option is copying files only exists in destination
xcopy /U %SRC%\* %out%

echo copied from %SRC% to %out%
set out=
%ROOT%\obj
ROOT
ROOT
%0, %1, %2 … の内容を シフトします。%0=%1, %1=%2, %2=%3 …
if exist "%~1" (command)
if not exist "%~1" (command)
if exist C:\a.txt (type C:\a.txt
echo type OK
) else (
echo type NG
)
ファイルまたはフォルダーが存在するとき
ファイルまたはフォルダーが存在しないとき
フォルダの中のすべてのファイルのうち、タイムスタンプが 6/12 以降のものを表示する
for /R %%i in (*.*) do @if "%%~ti" geq "2006/06/12 00:00"  echo %%~ni "%%~ti" %%i
if exist C:\a.txt type C:\a.txt & echo type OK
>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 "%%i" (
    echo %%i
  )
if not exist "%~1" echo Not found "%~1"& goto :eof
サンプル
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 /D /R %%i in (obj) 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 はディレクトリのみ
コマンドラインでは %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