batでファイルコピー

業務効率化術

日々仕事をしていると、ファイルを大量に作る機会やファイルコピーを大量にするということはありませんか?

そのような時まさか1つづつ作成、コピーしているということはありませんか?

1つのフォルダにあるファイルを一気にコピーするとかだったら、全選択してコピーすればいいだけですが、フォルダ分けしてあったりコピー先でフォルダ分けするなどとなると大変な労力が伴います。

そこでそういった面倒で時間のかかる作業はbatを使用して自動化してみてはどうでしょうか?

何のスキルむ身につかない作業を淡々とするよりも、少しでも自分に役に立つスキルを身に付けつつ作業をするという方が大変効率的です。

今回はファイルのコピーを実施する方法について解説していきます。

ファイルのコピー方法

ではファイルのコピー方法ですが、本当に単純な移動となると下記のように移動元と移動先をbatファイル内に記載するだけです。

copy 移動元ファイル 移動先パス

因みにbatファイルの作り方ですが、メモ帳を開けてそこで上記コマンドを記載します。

そしてファイルの拡張子をbatと変更するだけです。

これだけなら簡単に実施できます。

そこで今回は少し改良したbatファイルを作成してみます。

どういったものかというとまず下記のような構成のフォルダとファイルがあったとします。

上記のテキストファイルを「D:\program\bat\move\goal\」というパス上にテキストファイル名にちなんだフォルダを作成してその中に1つずつコピーしていくというものです。

つまり「D:\program\bat\move\goal\1-1\1-1.txt」や「D:\program\bat\move\goal\4-1\4-1.txt」などといったフォルダ内にファイルをそれぞれ配置するbatファイルとなっています。

自分は会社でファイルにちなんだフォルダを作成してその中にファイルをコピーしたいということがあった為、こういったbatファイルを作成しました。

ではどういったコードになるかというと下記のようになります。

@echo off

rem 移動元ファイルパス(ここでファイル名まで指定すると出力されなくなるためフォルダ名とファイル名を分けている)
set startfile=D:\program\bat\move\start\*
rem 移動先ファイルパス
set goalfile=D:\program\bat\move\goal\

rem フォルダ内のフォルダをまず変数に代入
for /d %%i in (%startfile%) do (
	rem フォルダ内のファイルを取得
	for %%j in ("%%i\*") do (
		rem フォルダ作成(ファイル名を基に作成)
		mkdir %goalfile%%%~nj
		rem 作成したフォルダにファイルを一つづつコピーする
		copy  %%j "%goalfile%%%~nj"
	)
)

このコードだけ見ても分からないと思いますので、解説していきます。

「for /d %%i in (%startfile%) do (」でコピー元パス上にあるフォルダ名を変数に1つずつ取り出しています。

今回ですとstartフォルダ内にある1~5というフォルダ名を取り出しています。

次に「for %%j in (“%%i\*”) do (」ですが、こちらでは先ほど取り出した1~5のフォルダ内にあるファイル名を一つずつ取り出して、変数に代入しています。

そして「mkdir %goalfile%%%~nj」ではコピー先に新しくフォルダを作成しています。

一番最初に「set goalfile=D:\program\bat\move\goal\」で変数にセットしていますが、そのパス上に新しくフォルダを作成します。

そのフォルダというのはコピー元にあるファイル名にちなんだフォルダ名のためコピー元をさす変数jに~nというファイル名(拡張子なし)をコピー先パスに最後に連結します。

これで新しくコピー先にフォルダが作成されます。

最後に「copy %%j “%goalfile%%%~nj”」でコピー元からコピー先にテキストファイルをすべてファイル名にちなんだフォルダにコピーしているといった内容のbatファイルとなっています。

パスにスペースがある時はどうする?

先ほどまでファイルをコピーするbatファイルについて解説してきましたが、batファイルを作成していて時々問題になってくるのが、ファイルのパスに空白がある時です。

例えば「D:\program\bat\move\空白 ファイル\start\」というようにパス上のフォルダ名に空白があった場合先ほどのbatファイルではコピーが失敗してしまします。

ではどうするのかというと、単純にダブルコーテーション(“”)でパス名を囲うのです。

先ほどのコードを修正したのが下記となります。

@echo off

rem 移動元ファイルパス(ここでファイル名まで指定すると出力されなくなるためフォルダ名とファイル名を分けている)
set startfile="D:\program\bat\move\空白 ファイル\start\*"
rem 移動先ファイルパス
set goalfile=D:\program\bat\move\空白 ファイル\goal\

rem フォルダ内のフォルダをまず変数に代入
for /d %%i in (%startfile%) do (
	rem フォルダ内のファイルを取得
	for %%j in ("%%i\*") do (
		rem フォルダ作成(ファイル名を基に作成)
		mkdir %goalfile%%%~nj
		rem 作成したフォルダにファイルを一つづつコピーする
		copy  %%j "%goalfile%%%~nj"
	)
)

「set startfile=”D:\program\bat\move\空白 ファイル\start\*”」のようにパスをダブルコーテーションで囲うことでコピーは問題なくできます。

時々batが動かないとなることがあり、その際の多くの原因が上記のパスにダブルコーテーションを付与してなかったというのがあります。

batが動作しないとなったらまずはパスにダブルコーテーションが足りているかを確認してみてください。

まとめ

この記事では業務効率アップの方法としてbatファイルを使用してのファイルコピーの方法について解説してきました。

  • ファイルの移動方法
  • パスにスペースがある時はどうする?

業務効率を上げるとなったら、batファイルを使用して仕事の自動化をまずは試してみるのがいいと思います。

特に単純作業で何時間もかかるような作業を何回もするとなった場合、自動化した方が大変効率的です。

ぜひ一度batによる業務効率化考えてみてください。

以上で今回の解説は終了となります。

コメント

タイトルとURLをコピーしました