👨‍💻

#18 『ファイル』を検索してコピーするバッチを作ってみました

2024/07/31に公開

はじめに

業務中に導入できそうな場面があったため、今回初めてバッチファイルを作成してみました。
ファイルを検索しコピーする簡単なものですが、備忘録として残します。

今回のバッチについて

やりたいこと

今回は以下のことを行うバッチを作成します。

  • 指定したフォルダの配下から、検索ワードと合致するファイルを探し出す
  • 探し出したファイルを指定した別フォルダにコピーする

これによりフォルダ間を行き来せずに効率的に作業を行えるようになります。

バッチの中身

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

@echo off

echo ファイル名を検索し指定ディレクトリへコピーします。
pause

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

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

rem ファイルコピー先パスをセット
set dest=C:\ParentDirB\ChildDirB

echo ファイルをコピーします。

rem コピー元ディレクトリへ移動
cd %src%

rem 検索ワードと部分一致するファイルを探して名前をリスト化する
rem リストの作成場所はDドライブ直下を指定しています。
dir /b *%str%* > C:\Users\hoge\Desktop\list.txt

rem ファイルコピー
for /f %%a in (C:\Users\hoge\Desktop\list.txt) do (
    copy "%src%\%%a" "%dest%\%%a"
)

rem 一時ファイルを削除
del C:\Users\hoge\Desktop\list.txt

echo 終了します。
pause

コマンドの説明

@ …
先頭に『@』をつけることでバッチ実行時にそのコマンドが表示されなくなる
@echo off 
『@echo off』を指定するとそれ以降のコマンドもバッチ実行時に表示されなくなる 
echo 文字
バッチ実行時に『文字』の部分がコマンドプロンプトに出力される
pause
バッチ実行時、記述箇所で一時停止する
rem コメント
バッチに影響を与えずコメントを残す
set 環境変数名=値
環境変数に値を設定する
cd パス
『パス』へ移動する
%~%
両端に『%』を記述するとsetした変数の中身が呼び出せる
dir 検索内容 > ファイル名
カレントディレクトリ内で検索内容と一致する結果をファイルに保存する 
今回は『C:\Users\hoge\Desktop\』に『list.txt』を作成しています
dir /b
ファイル名のみ出力する
*%str%*
『%str%』はsetした文字列
『*』はワイルドカード
『*』(ワイルドカード) 
『A*』なら始まりがAのときヒットする
『*A』なら終わりがAのときヒットする
『*%str%*』は『*A*』の形なので『%str%』と部分一致するものがヒットする
for …
ループ処理を行う
for /f …
in ()で指定したファイルの中身の1行1行に対しループ処理を行う
%%a
forの中で使用する変数名
一文字で指定される、今回は『a』で指定しています
今回は『list.txt』の何行目かを示していると考えるとわかりやすいです
copy コピー元ファイル コピー先ファイル
ファイルをコピーする
"%src%\%%a"
『%src%』と『\』と『%%a』を一つにつなげています
今回は『C:\ParentDirA\ChildDirA』『\』『list.txtのn行目』となります
del 名前
フォルダやファイルを削除する 
使わなくなった『list.txt』を削除しています

バッチが実行時に文字化けしたら

文字コードが『UTF-8』になっていませんか?
メモ帳でバッチを編集するとき、右下に文字コードが表示されるので確認してみてください。
メニューバーの『名前を付けて保存』を押下、『エンコード』から文字コードを確認・変更することができるので、『ANSI』に設定して保存してください。

最後に

今回は簡単な内容でしたが、より簡潔に書く方法など引き続き学んでいきたいです。
みなさんも、バッチを作成して作業を効率化してみてください!
それでは。

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

Discussion