制御構文
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
%変数 ではなく %%変数 でないとだめ
for %%i in (1 2 3) do mkdir test_%%i
FOR /L %%i IN (1,1,5) DO echo %%i
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
FOR /F "tokens=1 delims=," %%i in (foo.csv) DO echo %%i
FOR /F "tokens=1 delims=, " %%i in (foo.csv) DO echo %%i
FOR /F "tokens=2,3 delims=," %%i in (foo.csv) DO echo %%i %%j
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
)
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 (
)
if not %ERRORLEVEL% == 0 (
goto ERROR
)
WARNING
if %ERRORLEVEL% 0 (
)
if %ERRORLEVEL% 1 (
)
if not %ERRORLEVEL% 3 (
)
IF exist dir (
) ELSE (
)
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 が変数展開されると次のようになる。
if aaa == %1 (
echo same
)
if aaa == (
)
if "aaa" == "%1" (
echo same
)
ELSE 節は IF の後のコマンドと同じ行におく
BAD
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