■ 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 のオプション値として指定する
■ 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