7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

##やりたいこと

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

###要するに

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. 実行してみる

2019-01-19 (3).png

おお!

2019-01-19 (4)_LI.jpg

おお!

2019-01-19 (5)_LI.jpg

おお!

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

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?