制御構文





for_each_file


パターンにマッチするファイルを処理する
for %%f in (*.*) do echo %%f for %%f in (*.txt) do echo %%f
再帰的にするには /R をつける
for /R %%f in (*.txt) do echo %%f



forfiles


Windows VISTA 以降から利用できる。
forfiles /c "cmd /c echo @file" forfiles /c "cmd /c echo @path"
再帰的に検索する。
forfiles /s /c "cmd /c echo @path"
パターンを指定する
forfiles /m *.txt /c "cmd /c echo @path"
日付を指定する。
// 2015/3/1 以降に編集したファイル forfiles /d +2015/3/1 /c "cmd /c echo @path" // 30 日前に編集した forfiles /d -30 /c "cmd /c echo @path"



for


SYNTAX FOR %%変数 IN (セット) DO command [param] FOR /L %%変数 IN (開始,ステップ,終了) DO command [param] DESC (Set) 内のトークンを変数にセットしてひとつずつコマンドで処理する WARNING %変数 ではなく %%変数 でないとだめ
:: 連番 Directory をつくる for %%i in (1 2 3) do mkdir test_%%i :: 1 2 3 4 5 FOR /L %%i IN (1,1,5) DO echo %%i :: 5 4 3 2 1 FOR /L %%i IN (5,-1,1) DO echo %%i
SYNTAX FOR /F "eol=; tokens=2,3* delims=, " %%i in (file) do @echo %%i %%j %%k DESC file の各行を delims で区切り, 指定した tokens を変数にバインドして 処理をする
; foo.csv aaa,bbb,ccc 111,222,333 :: aaa :: 111 FOR /F "tokens=1 delims=," %%i in (foo.csv) DO echo %%i :: 区切り文字 [,] [ ] FOR /F "tokens=1 delims=, " %%i in (foo.csv) DO echo %%i :: 2, 3 番目 Token を変数 i, j に Bind FOR /F "tokens=2,3 delims=," %%i in (foo.csv) DO echo %%i %%j :: Comment 文字 [;] より後ろは SKIP FOR /F "eol=; tokens=1 delims=," %%i in (foo.csv) DO echo %%i
/F ["<options>"] [Windows NT系] [拡張構文] <pattern> のデータを1行ずつ読み取って解析し、それらに対して <command-line> を実行します。%variableには解析した文字列が入ります。解析方法は「"<options>"」で指定します(解説参照)。 <pattern> にはファイル名(スペースやセミコロンで区切ることで複数指定可能です)、文字列(" "で囲みます)、コマンドライン(コマンドラインを' 'で囲みます)が指定可能で、それぞれファイルの中身、文字列そのもの、コマンドライン実行時の(標準出力への)出力結果を入力データとします。ただし、<options> に「usebackq」を含む場合は、文字列は「' '」で、コマンドラインは「` `」で囲む形式に変わります(これによりファイル名に「" "」を使用することができます)。 ※ <pattern> にコマンドラインを指定する場合で、パイプやリダイレクションを使用する場合は それらの文字の直前に「^」を用いることで使用可能ですが、複数のコマンドを「( )」を用いて記述(ネスト)すると正しく解釈されない場合がありますので、使用する際はご注意ください。 delims=delimiters delims="" /F のオプション値として指定する
/F "delims="



if


SYNTAX // {} でないよ ! () だよ ! IF [NOT] ERRORLEVEL 番号 code IF [NOT] 文字列1==文字列2 code IF [NOT] EXIST ファイル名 code IF defined 変数 ( code ) [else code ]
:: 文字列の比較 IF var == 7 ( echo same ) ELSE ( echo diff ) :: Insentive指定( 大文字, 小文字の違いは無視する ) if /I Test == test ( echo same ) else ( echo diff ) :: 文字列が数値のみなら 数値に変換されて大小比較 if 10 LSS 12 ( echo 10 は 12 より小さい ) else ( echo false ) EQU - 等しい NEQ - 等しくない LSS - より小さい LEQ - 以下 GTR - より大きい GEQ - 以上
ERRORLEVEL で処理をわける
if %ERRORLEVEL% == 0 ( ) :: 否定は not を使う。 != はできない。 if not %ERRORLEVEL% == 0 ( goto ERROR ) WARNING :: 次の表記もできるが、誤解しやすいので推奨しない :: 0 以上ならば if %ERRORLEVEL% 0 ( ) :: 1 以上ならば if %ERRORLEVEL% 1 ( ) :: 3 未満ならば if not %ERRORLEVEL% 3 ( )
:: directory の有無をチェック IF exist dir ( ) ELSE ( ) :: file の有無をチェック IF exist test.txt ( ) ELSE ( ) :: 変数が定義されているかどうかチェック IF defined v ( echo Def ) ELSE ( echo NotDef ) :: 環境変数があるかどうか IF defined USERNAME ( echo Def %USERNAME% ) ELSE ( echo NotDef ) WARNING :: 以下の記述はエラーになる。 if aaa == aaa ( echo "same" )
引数が空だと問題がある 理由は %1 が変数展開されると次のようになる。
:: BAD :: コマンドの構文が間違っています if aaa == %1 ( echo same ) :: %1 の展開後の結果 if aaa == ( ) :: そこで "" 囲む。 :: OK if "aaa" == "%1" ( echo same )
ELSE 節は IF の後のコマンドと同じ行におく
BAD :: C のようにかけない :: "ELSE" を命令として勘違いする IF EXIST filename. ( del filename. ) ELSE ( echo filename. missing. ) OK IF EXIST filename. ( del filename. ) ELSE ( echo filename. missing. ) :: 一行にしても良い。 IF EXIST filename. (del filename.) ELSE echo filename. missing