👩‍🏫

#21 『フォルダ』を検索してコピーするバッチを作ってみました

2024/08/07に公開

はじめに

前回は、指定したフォルダ内を検索し検索ワードとファイル名が部分一致するファイルをコピーするバッチを作成しましたが、今回はフォルダ用のバッチを作成しました。
前回から変更した点もございますので、ぜひ併せてご覧ください。

↓ 前回の記事はこちら ↓
『ファイル』を検索してコピーするバッチを作ってみました

今回のバッチについて

やりたいこと

今回作成したバッチファイルでは以下のことを行います。

・指定したフォルダの配下から検索ワードと合致するフォルダを探し出す
・探し出したフォルダを中身ごとコピーし指定した別フォルダに貼り付ける

前回からの変更点

①フォルダとファイルを見分けられるよう、パスの最後に『\』まで含んで記述しています。

②『setlocal』~『endlocal』をつけ足すことで、
『set』をグローバル変数ではなく、ローカル変数に設定しています。

詳細は『コマンドの説明』にて記述します。

バッチの中身

バッチファイルの中身は以下の通りです。

@echo off

echo 検索ワードが含まれるフォルダを指定ディレクトリへコピーします
pause

setlocal
rem 検索ワード(SearchStrの部分)をセット
set str=SearchStr

rem コピー元パスをセット
set src=C:\ParentDirA\ChildDirA\

rem コピー先パスをセット
set dest=C:\ParentDirB\ChildDirB\
endlocal

echo フォルダをコピーします

rem コピー元ディレクトリへ移動
cd %src%
rem 検索ワードと部分一致するフォルダを探してリスト化する
dir /b /ad *%str%* > %src%list.txt

rem リストのフォルダをコピー先にコピーする
for /f %%a in (%src%list.txt) do (
  xcopy /e "%src%%%a¥" "%dest%%%a¥"
)

rem 一時ファイルを削除
del %src%list.txt

echo 終了します
pause

コマンドの説明

前回の記事で解説したコマンドについては省略しています。

『setlocal』~『endlocal』
この間で『set』した変数はローカル変数として扱われ、『endlocal』の後には参照できなくなります。
グローバル変数の場合、バッチ実行後にもコマンドプロンプトに定義が残ってしまうため、変数名が同じ場合他のバッチからも呼び出されてしまうことがあります。
xcopy コピー元フォルダ コピー先フォルダ
フォルダ(ディレクトリ)ごとコピーする
xcopy /e
空のディレクトリも含めコピーする
『"%src%%%a¥"』
『%src%』『%%a』『\』と最後に『\』をつけることでパスがフォルダ名であることを示しています。

『xcopy』を実行すると、
______________________

 C:\Users\tarou\Desktop\hoge は受け側のファイル名ですか、
またはディレクトリ名ですか
(F= ファイル、D= ディレクトリ)?

______________________

と聞かれますが、『\』をつけることで省略できます。

dirコマンドについて

dir のみ、オプションをつけない場合以下のような結果が出力されます。
______________________

 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は XXXX-XXXX です

 C:\Users\tarou\Desktop\piyo のディレクトリ

2023/07/19  22:37                 0 piyo.txt
2023/07/19  22:30    <DIR>          piyoo
2023/07/19  22:37                 0 piyoo.txt
2023/07/23  17:53    <DIR>          piyooo
               3 個のファイル                   0 バイト
               2 個のディレクトリ  XXX,XXX,XXX,XXX バイトの空き領域
______________________
dir /b
フォルダ・ディレクトリ名のみを出力し、その他の情報は出力しません。
______________________

piyo.txt
piyoo
piyoo.txt
piyooo
______________________
dir /ad
ファイル名は出力せず、フォルダ名とその他の情報を出力します。
______________________

 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は XXXX-XXXX です

 C:\Users\tarou\Desktop\piyo のディレクトリ

2023/07/19  22:30    <DIR>          piyoo
2023/07/23  17:53    <DIR>          piyooo
               0 個のファイル                   0 バイト
               2 個のディレクトリ  XXX,XXX,XXX,XXX バイトの空き領域
______________________
dir /b /ad
フォルダ名のみ出力されます。
______________________

piyoo
piyooo
______________________

最後に

コピーの対象がファイルかフォルダかでバッチの書き方が異なること、同じ処理でもいろいろな書き方があることがわかりました。
初歩的な内容でしたが参考にしていただけたら幸いです。
ご覧いただき、ありがとうございました。

出典:
https://www.tohoho-web.com/ex/bat.html
https://jj-blues.com/cms/quick_search/wanttodo/

Discussion