この記事では、バッチファイルにドロップした複数フォルダを一括でコピーする方法についてご説明します。
なお今回のバッチファイルは、フォルダをコピーする際は指定した拡張子のファイルを除外する指定をコードに盛り込みます。
指定した拡張子のファイルを除外する指定をコードに盛り込むことで、フォルダをバッチファイルにドロップした際、バッチファイル実行後はその指定した拡張子のファイルはコピーされなくなります。
例えば、拡張子が「txt」「csv」のファイルを除外するよう指定しておくと、フォルダ配下にある拡張子が「txt」「csv」のファイルを除いてフォルダをコピーします。(「txt」「csv」のファイルはコピーしない)
【動画】(指定した拡張子のファイルを除外して)バッチファイルにドロップした複数フォルダを一括でコピーする実際の動き
本題に入る前に、まずは次の動画をご覧ください。
注意
今回紹介するバッチファイルはフォルダをコピーするので、大事なファイルを上書きしてしまったり、フォルダが生成されるなど、パソコン内のディレクトリ環境を変えてしまう場合があります。
バッチファイルを実行する前は、必ずコピー先の指定に十分お気を付けください。
その点を留意して自己責任でお使いいただければ幸いです。
フォルダの例
「C:¥work¥10_勉強¥17_バッチファイル¥0007¥from」配下のフォルダに、「data」「file」「xyz 2023」というフォルダが存在しています。
今回はこの「data」「file」「xyz 2023」の3つのフォルダを、バッチファイルにドロップして「C:¥work¥10_勉強¥17_バッチファイル¥0007¥to」配下にコピーします。
ただし、今回のバッチファイルでは、拡張子が「txt」「csv」のファイルは除外するよう指定します。
なお、「data」「file」「xyz 2023」それぞれのフォルダには下の画像のとおりにファイルとフォルダが格納されています。
①「data」
②「file」
③「xyz 2023」
今回紹介するバッチファイルにフォルダをドロップして実行させると、バッチファイルのコピー処理が実行されて「C:¥work¥10_勉強¥17_バッチファイル¥0007¥to」配下に「data」「file」「xyz 2023」全てフォルダがコピーされます。
コピーされた「data」「file」「xyz 2023」それぞれのフォルダ配下は下のとおりです。
①「data」
②「file」
③「xyz 2023」
各フォルダ配下を見てみると、拡張子が「txt」「csv」のファイルはコピーされず、拡張子が「txt」「csv」以外のファイル全てがコピーされています。
コードの例
@echo off rem コピー先のフォルダを指定する set copyTo=C:\work\10_勉強\17_バッチファイル\0007\to rem ドロップされたフォルダの数だけ処理を繰り返すfor文 for %%i in (%*) do ( rem ドラッグされた各フォルダをコピーする robocopy "%%~i" "%copyTo%\%%~ni" /E /XF *.txt /XF *.csv )
注目すべきコード①
最初に見て頂きたいのは4行目です。
rem コピー先のフォルダを指定する set copyTo=C:\work\10_勉強\17_バッチファイル\0007\to
コードの説明
以上のコードは、コピー先のフォルダパスを取得するコードです。
バッチファイルにフォルダをドロップしてそのフォルダをコピーする先のフォルダパスを指定します。
注目すべきコード②
次に見て頂きたいのは7行目です。
rem ドロップされたフォルダの数だけ処理を繰り返すfor文 for %%i in (%*) do (
コードの説明
以上のコードは、ドロップされたフォルダの数だけ処理を繰り返すfor文です。
今回の例では3つのフォルダをバッチファイルにドロップしますが、ドロップするフォルダの数が3つなので、3回処理を繰り返します。
①%%i
バッチファイルにドロップされたフォルダが代入されます。
③in
INはFor文とセットで使う構文の一部で、INの後にバッチファイルにドロップされたフォルダ全てが指定されます。
④%*
%*には、バッチファイルにドロップされたフォルダ全てが格納されます。
⑤do
doはFor文とセットで使う構文の一部です。
注目すべきコード③
次に見て頂きたいのは10行目です。
rem ドラッグされた各フォルダをコピーする robocopy "%%~i" "%copyTo%\%%~ni" /E /XF *.txt /XF *.csv
コードの説明
以上のコードは、robocopyコマンドを実行して、バッチファイルにドロップされたフォルダをコピー先にコピーする処理のコードです。
また、「/XF」オプションを使い、コピーを除外する対象のファイルの拡張子を指定します。
以上のコードでは「/XF」オプションに「txt」と「csv」を指定していますが、robocopyコマンドが実行されると拡張子が「txt」と「csv」のファイルがコピーされなくなります。
第1引数:”%%~i”
第1引数である「”%%~i”」には、バッチファイルにドロップされたフォルダのフルパスが格納されています。
以下の画像だと、「C:¥work¥10_勉強¥17_バッチファイル¥0007¥from」配下の「data」「file」「xyz 2023」の3つのフォルダがバッチファイルにドロップされたので、「”%%~i”」には「data」「file」「xyz 2023」のうち「C:¥work¥10_勉強¥17_バッチファイル¥0007¥from¥data」の文字列(フルパス)が格納されます。
ちなみに「”」(ダブルクォーテーション)で囲っているのは、スペースを含むフォルダ名を認識させるためです。
フォルダ名にスペースが含まれていると、スペースの前後で2つの引数として認識されてしまうため、「”」(ダブルクォーテーション)で囲むことで1つの引数として認識させることができます。
第2引数:”%copyTo%¥%%~ni”
第2引数である「”%copyTo%¥%%~ni”」には、コピー先のパスが格納されています。
例えば「C:¥work¥10_勉強¥17_バッチファイル¥0007¥from」配下の「data」のフォルダがドロップされた場合、「”%copyTo%¥%%~ni”」には、「C:¥work¥10_勉強¥17_バッチファイル¥0007¥from¥data」の文字列が格納されます。
「”%copyTo%¥%%~ni”」だと分かりづらいので、下のとおりに分解してみます。
- %copyTo%:copyToに格納されている値(コピー先のフォルダ)
- ¥:パスの区切り文字「¥」
- %%~ni:ドロップされたフォルダのパスの最下層のディレクトリ
①%copyTo%
「%copyTo%」は、copyToに格納されている値(コピー先のフォルダ)が格納されています。
今回の例では、copyToに「C:¥work¥10_勉強¥17_バッチファイル¥0007¥to」が格納されています。
②¥
「¥」はパスの区切り文字です。
③%%~ni
「%%~ni」は第1引数の「%%~i」に格納された、バッチファイルにドロップされたフォルダのフルパスの最下層ディレクトリです。
例えば「C:¥work¥10_勉強¥17_バッチファイル¥0007¥from」配下の「data」のフォルダがドロップされた場合、「%%~i」には「data」の文字列が格納されます。
【オプション①】/E
「/E」のオプションは、ディレクトリまたはサブディレクトリが空であってもコピーする、というオプションです。
【オプション②】/XF
「/XF」のオプションを付けて、そのあとスペース文字を1つ入れてファイルの拡張子を指定すると、robocopyコマンド実行時に、指定した拡張子のファイルがコピーされなくなります。
拡張子の指定は、「txt」の場合は「*.txt」と記述します。
また、拡張子を複数指定したい場合は、「/XF」でファイルの拡張子の除外設定を記述したその後ろに追記します。
追記する場合は、1つの拡張子に付き「/XF」を必ず記述してその後に拡張子を記述します。
下のように、1つの拡張子に対して「/XF」の記述を忘れないようにしましょう。
- 【誤】robocopy “%%~i” “%copyTo%\%%~ni” /E /XF *.txt *.csv
- 【正】robocopy “%%~i” “%copyTo%\%%~ni” /E /XF *.txt /XF *.csv
動作確認
「フォルダの例」をご覧ください。
最後に
この記事では、バッチファイルにドロップした複数フォルダを一括でコピーする方法についてご説明しました。
なお今回のバッチファイルは、フォルダをコピーする際は指定した拡張子のファイルを除外する指定をコードに盛り込んでいます。
バッチファイルにドロップするだけでフォルダがコピーされますが、フォルダ配下にある一部の拡張子のファイルはコピーしたくないという場合は本記事を参考にして頂けたら幸いです。
プログラミングのスキルを習得するなら
プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。
プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。