Windowsのコマンドプロンプトでファイルを1行ずつ読み込む


やりたいこと

  • ファイルに記載された指定の名前でディレクトリを作成する
  • 作成したディレクトリ配下に指定のサイズのダミーファイルを作成する

要するに

makeFile.txt
20190101 01
20190101 02
20190102 01
20190115 01

このようにスペース区切りで書かれたファイルがあるとすると、下記のようにC:¥workの配下にディレクトリを作成し、

C:¥work¥
     |-20190101
     |     |-01
     |     |-02
     |-20190102
     |     |-01
     |-20190115
           |-01

さらに最深ディレクトリにdummy1.txt〜dummy5.txtを作成&配置。

C:¥work¥
     |-20190101
     |     |-01
     |     |  |-dummy1.txt
     |     |  |-dummy2.txt
     |     |  |-dummy3.txt
     |     |  |-dummy4.txt
     |     |  |-dummy5.txt
     |     |-02
     |     |  |-dummy1.txt
     |     |  ~略~
     |     |  |-dummy5.txt
     |-20190102
     |     |-01
       ~略~

手作業だとめんどくせぇ手間がかかるので、バッチで一気に作ってもらおう!と。^^

1. ファイルを1行ずつ読み込む

for /f %%[アルファベット1文字] in ([ファイル名]) do ([処理])

まず初めにファイルを1行ずつ読み込み、スペースを区切りとしてそれぞれの値を取得して変数に格納します。

@echo off

rem makeFile.txtからスペースまで(1列目)をaに格納,2列目をbに格納
for /f "tokens=1,2" %%a in (makeFile.txt) do (
  echo %%a
  echo %%b
  echo ----------
)

実行結果

20190101
01
----------
20190101
02
----------
20190102
01
----------
20190115
01
----------

"tokens=n"でn列目の値を取得してくれます。今回は1列目と2列目を取得したいので"tokens=1,2"と書きます。変数には%%aだけ書けば、自動的にbに二つ目の値が取得されます。そのためxyz等の変数を指定するのはやめておいたほうがいいでしょう。

スペースが区切りとなる
もしスペースを区切りとせずに1行全体を取得したい場合は「delims」オプションをつけます。

@echo off

rem makeFile.txtから1行全体を取得
for /f "delims=" %%a in (makeFile.txt) do (
  echo %%a
  echo ----------
)

実行結果

20190101 01
----------
20190101 02
----------
20190102 01
----------
20190115 01
----------

もし区切り文字がスペースでなく「/」だったら"delims=/"と書きます。

forループを使ってファイル内容を一行ずつ読み込む

2. ディレクトリ作成

mkdir <ディレクトリ名>
で作成できます。
上記のforループとmkdirコマンドで指定のディレクトリを作成することができます。

mkdir.bat
@echo off
cd /d %~dp0

setlocal enabledelayedexpansion
rem makeFile.txtからスペースまで(1列目)をaに格納,2列目をbに格納
for /f "tokens=1,2" %%a in (makeFile.txt) do (
    set dir1=%%a
    set dir2=%%a\%%b

    rem ディレクトリがなければ作成
    if not exist !dir1! (
        echo !dir1!のディレクトリを作成します
        mkdir !dir1!
        if not exist !dir2! (
            echo !dir2!のディレクトリを作成します
            mkdir !dir2!
        )
    ) else (
        if not exist !dir2! (
            echo !dir2!のディレクトリを作成します
            mkdir !dir2!
        )
    )
)
endlocal

注意
「setlocal enabledelayedexpansion」はforループの中で値を変化させるためのおまじないです。
setlocal enabledelayedexpansion ~ endlocalでforループを囲ってあげましょう。
また、ループ内で変数を使用する場合は、%ではなく!で囲む必要があります。

バッチファイルでループ処理する

3. 指定したサイズのダミーファイルの作成

ファイルの作成は
fsutil file createnew <ファイル名> <サイズ(byte)>
でできます。

指定サイズダミーファイル生成(Windows, Mac)

これをforで5回まわしてあげます。
for /L %%[アルファベット1文字] in (開始,ステップ,終了) do ([処理])

意外と知られていないけど、知っていると便利な FOR コマンド

mkdir.bat
@echo off
cd /d %~dp0

setlocal enabledelayedexpansion
rem makeFile.txtからスペースまで(1列目)をaに格納,2列目をbに格納
for /f "tokens=1,2" %%a in (makeFile.txt) do (
    set dir1=%%a
    set dir2=%%a\%%b

    rem ディレクトリがなければ作成
    if not exist !dir1! (
        echo !dir1!のディレクトリを作成します
        mkdir !dir1!
        if not exist !dir2! (
            echo !dir2!のディレクトリを作成します
            mkdir !dir2!
        )
    ) else (
        if not exist !dir2! (
            echo !dir2!のディレクトリを作成します
            mkdir !dir2!
        )
    )

    set count=0
    for /L %%n in (0,1,5) do (
        set /a count=!count!+1
        fsutil file createnew !dir2!\dummy!count!.txt 1024
    )
)
endlocal

これで完成です。
今回は1KBのダミーファイルを作成しました。

4. 実行してみる

おお!

おお!

おお!

できました。ちゃんと1KBになってますね
以上です。ありがとうございます。