初めてバッチファイルを作った話


仕事で大量のデータ取り込みのテストを行うに当たって100個のファイルが必要になり、地道に手動でテストデータ入りのファイルをコピペすると1日かかりますし、腱鞘炎になってしまう!
何とか一瞬で100個のファイルをコピー出来る手段は無いのか・・・と調べると、バッチファイルを作って自動でコピー出来ることが判明!
「バッチファイル・・・難しそうだけどやってみるか!」と思い、さっそく作成しました。

作成したバッチファイルの概要

1.編集で指定した数の分だけファイルをコピーする
2.コピーされた際、0埋めされた番号が採番されること

作成したバッチファイルの中身

ネットで調べながら以下のバッチファイルが完成致しました。

Copyfile.bat
setlocal enabledelayedexpansion

for /l %%n in (2,1,10) do (
set num=00%%n
echo !num:~-3!
copy C:\Users\Public\TEST\test_001_20191226.txt C:\Users\Public\TEST\test_!num:~-3!_20191226.txt
)
endlocal
pause

中身の解説

setlocal enabledelayedexpansion
ローカル変数を使う場合に宣言する時に使うコマンド
これを使うことで、バッチ実行中に変数の値を変化させることが出来ます。

for /l %%n in (2,1,10) do
「for」は繰り返し処理をさせるコマンド。
「/l」は後ろの(開始の番号,増分,終了の番号)を有効にさせるコマンドです。
「%%n」は格納する変数です。
この場合は「2から1ずつ採番し、10になったら終了」という意味になります。

set num=00%%n
echo !num:~-3!

ここでは上記の変数の左2桁を0で埋めたものを「num」という変数にセットしました。
これだけだと10以降に差し掛かった時「0010」となってしまう為、「num」の右2桁を読み込む処理を追加しました。
「!」で囲まれているのは「遅延環境変数」にさせる為です。
バッチファイルの特徴として、「設定した条件に差し掛かった時、以後全ての変数を展開させる」というものがあります。
これだと初めに格納した値でしか処理されないです。
その為、後のタイミングで展開させたい時に使うのが「遅延環境変数」です。
上記のsetlocal enabledelayedexpansionを最初に宣言し、展開するタイミングをずらしたい変数を「!」で囲みます。

copy C:\Users\Public\TEST\test_001_20191226.txt C:\Users\Public\TEST\test_!num:~-3!_20191226.txt
)

「copy」はファイルをコピーさせるコマンドです。
copy コピー元のファイル名 コピーされるファイル名という構文で使います。

endlocal
最初に宣言した「setlocal」の範囲を締めるコマンド。

pause
処理が全て完了した後自動でコマンドプロンプトが消えず、手動で終了させるコマンド。
「終了する時は何かキーを押して下さい」と表示させるのはこれ。

実際に動かしてみた

作成したバッチファイルを以下のフォルダにセットします。

↓バッチが動きました!

↓フォルダを確認すると、「010」まで採番されたファイルが作成されていることを確認

まとめ

以上より、ファイルを大量にコピーさせるバッチファイルを作成致しました。
0埋めの連番処理で少々詰まってしまいましたが、思った以上に簡単に作ることが出来ました。
今回作ったものをきっかけに、業務効率化を図るのに自分でバッチファイルを作る選択肢が増え、普段の業務をよりスムーズに出来るようにさせていきたいと思います。

2020年7月10日 追記

久しぶりにバッチファイルを動かそうとしたら、ファイル名に「()」が含まれていることが原因で動かすことが出来ませんでした。
ファイル名から「()」を取り除いたら正常に動くことは出来ましたが、「()」や「「|」が含まれているファイルに対しては現在調査中ですが、これらの記号をファイル名に含ませることはタブーに近いことみたいですね。

参考文献

バッチファイルでファイル名に連番を付けてコピーする~実行解説

SE日記 windowsコマンドで連番付きのファイルを一気に大量に作る/コピーする方法

Lyo.blog バッチファイルで前ゼロ付き連番ファイル生成

知識ゼロからのwindowsバッチファイル入門

バッチファイル界の魔境『遅延環境変数』に挑む(おまけもあるよ)

ファイル名に使わない方が良い文字