##やりたいこと
- ファイルに記載された指定の名前でディレクトリを作成する
- 作成したディレクトリ配下に指定のサイズのダミーファイルを作成する
###要するに
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=/"と書きます。
##2. ディレクトリ作成
mkdir <ディレクトリ名>
で作成できます。
上記のforループとmkdirコマンドで指定のディレクトリを作成することができます。
@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)>
でできます。
これをforで5回まわしてあげます。
for /L %%[アルファベット1文字] in (開始,ステップ,終了) do ([処理])
@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になってますね
以上です。ありがとうございます。