【バッチファイル】バッチファイルに複数のフォルダをドロップしてそのフォルダ全てをコピーするには

この記事では、バッチファイルに複数のフォルダをドロップしてそのフォルダ全てをコピーする方法についてご説明します。

【動画】バッチファイルに複数のフォルダをドロップしてそのフォルダ全てをコピーする実際の動き

本題に入る前に、まずは次の動画をご覧ください。


注意

今回紹介するバッチファイルはフォルダをコピーするので、大事なファイルを上書きしてしまったり、フォルダが生成されるなど、パソコン内のディレクトリ環境を変えてしまう場合があります。

バッチファイルを実行する前は、必ずコピー先の指定に十分お気を付けください。

その点を留意して自己責任でお使いいただければ幸いです。

フォルダの例

「C:¥work¥10_勉強¥17_バッチファイル¥0006¥from」配下のフォルダに、「data」「file」「xyz 2023」というフォルダが存在しています。

今回はこの「data」「file」「xyz 2023」の3つのフォルダを、バッチファイルにドロップして「C:¥work¥10_勉強¥17_バッチファイル¥0006¥to」配下にコピーします。

なお、「data」「file」「xyz 2023」それぞれのフォルダには下の画像のとおりにファイルとフォルダが格納されています。

①「data」

②「file」

③「xyz 2023」

今回紹介するバッチファイルを実行すると、バッチファイルのコピー処理が実行されて「C:¥work¥10_勉強¥17_バッチファイル¥0006¥to」配下に「data」「file」「xyz 2023」全てフォルダがコピーされます。

「data」「file」「xyz 2023」それぞれのフォルダ配下を見てみると、すべてがコピーされています。

①「data」

②「file」

③「xyz 2023」

コードの例

@echo off

rem コピー先のフォルダを指定する
set copyTo=C:\work\10_勉強\17_バッチファイル\0006\to

rem ドロップされたフォルダの数だけ処理を繰り返すfor文
for %%i in (%*) do (

  rem フォルダをコピーする
  xcopy /E /I "%%~i" "%copyTo%\%%~ni"
  
)

注目すべきコード①

最初に見て頂きたいのは4行目です。

rem コピー先のフォルダを指定する
set copyTo=C:\work\10_勉強\17_バッチファイル\0006\to

コードの説明

以上のコードは、コピー先のフォルダパスを取得するコードです。

バッチファイルにフォルダをドロップしてそのフォルダをコピーする先のフォルダパスを指定します。

注目すべきコード②

次に見て頂きたいのは7行目です。

rem ドロップされたフォルダの数だけ処理を繰り返すfor文
for %%i in (%*) do (

コードの説明

以上のコードは、ドロップされたフォルダの数だけ処理を繰り返すfor文です。

今回の例では3つのフォルダをバッチファイルにドロップしますが、ドロップするフォルダの数が3つなので、3回処理を繰り返します。

①%%i

バッチファイルにドロップされたフォルダが代入されます。

②in

INはFor文とセットで使う構文で、INの後にバッチファイルにドロップされたフォルダ全てが指定されます。

③%*

%*には、バッチファイルにドロップされたフォルダ全てが格納されます。

④do

doはFor文とセットで使う構文です。

注目すべきコード③

次に見て頂きたいのは10行目です。

  rem フォルダをコピーする
  xcopy /E /I "%%~i" "%copyTo%\%%~ni"

コードの説明

以上のコードは、xcopyコマンドを実行して、バッチファイルにドロップされたフォルダをコピー先にコピーする処理のコードです。

第1引数:”%%~i”

第1引数である「”%%~i”」には、バッチファイルにドロップされたフォルダのフルパスが格納されています。

以下の画像だと、「C:¥work¥10_勉強¥17_バッチファイル¥0006¥from」配下の「data」「file」「xyz 2023」の3つのフォルダがバッチファイルにドロップされたので、「”%%~i”」には「data」「file」「xyz 2023」のうち「C:¥work¥10_勉強¥17_バッチファイル¥0006¥from¥data」の文字列(フルパス)が格納されます。

ちなみに「”」(ダブルクォーテーション)で囲っているのは、スペースを含むフォルダ名を認識させるためです。

フォルダ名にスペースが含まれていると、スペースの前後で2つの引数として認識されてしまうため、「”」(ダブルクォーテーション)で囲むことで1つの引数として認識させることができます。

第2引数:”%copyTo%¥%%~ni”

第2引数である「”%copyTo%¥%%~ni”」には、コピー先のパスが格納されています。

例えば「C:¥work¥10_勉強¥17_バッチファイル¥0006¥from」配下の「data」のフォルダがドロップされた場合、「”%copyTo%¥%%~ni”」には、「C:¥work¥10_勉強¥17_バッチファイル¥0006¥from¥data」の文字列が格納されます。

「”%copyTo%¥%%~ni”」だと分かりづらいので、下のとおりに分解してみます。

  1. %copyTo%:copyToに格納されている値(コピー先のフォルダ)
  2. ¥:パスの区切り文字「¥」
  3. %%~ni:ドロップされたフォルダのパスの最下層のディレクトリ

①%copyTo%

「%copyTo%」は、copyToに格納されている値(コピー先のフォルダ)が格納されています。

今回の例では、copyToに「C:¥work¥10_勉強¥17_バッチファイル¥0006¥to」が格納されています。

②¥

「¥」はパスの区切り文字です。

③%%~ni

「%%~ni」は第1引数の「%%~i」に格納された、バッチファイルにドロップされたフォルダのフルパスの最下層ディレクトリです。

例えば「C:¥work¥10_勉強¥17_バッチファイル¥0006¥from」配下の「data」のフォルダがドロップされた場合、「%%~i」には「data」の文字列が格納されます。

【オプション①】/E

「/E」のオプションは、ディレクトリまたはサブディレクトリが空であってもコピーする、というオプションです。

【オプション②】/I

「/I」のオプションを付けると、xcopyコマンド実行時にコピー先のフルパス(C:¥work¥10_勉強¥17_バッチファイル¥0006¥to¥data)をフォルダとして判断し コピーを行います。

xcopyコマンドがフォルダだと判断するため、xcopy実行時に、「C:¥work¥10_勉強¥17_バッチファイル¥0006¥to¥data」がファイル名を指定しているのか、それともディレクトリ名を指定しているのかを確認する以下の画像のメッセージは表示されなくなります。

動作確認

フォルダの例」をご覧ください。

最後に

この記事では、バッチファイルに複数のフォルダをドロップしてそのフォルダ全てをコピーする方法についてご説明します。

バッチファイルにドロップするだけでフォルダがコピーされるのでお手軽で便利です。

例えば定期的に何かフォルダをバックアップしておきたい時に使うと良いですね。

複数のフォルダをまとめてコピーしたい場合は本記事を参考にして頂けたら幸いです。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら