バッチファイル(ファイル操作_2_ファイル移動)

■指定の文字列のファイルを移動させる。
前回、下のようなフォルダ構成を作成したので、この中でAAAが付くものを別フォルダに移動させることを考えてみる。

dirで該当するファイル名を検索し対象を限定した後、moveで移動させる流れで考える。まず、単純にdirを実行すると、下のようにそのフォルダ内にあるフォルダとファイルが表示される。

ここから再帰的に処理をしないといけないかと思ったけど、コマンドプロンプトで使えそうなオプションを探していくと、/sと/bがあった。/bは、ファイル名を表示する。/sは、指定されたフォルダとそのサブフォルダのすべてのファイルを表示する(dir /?でオプションの解説が出てくる)。

dir /s /bを実行すると下のような表示となる。ファイルとフォルダを含めてすべてフルパスで表示されているよう。

そこからさらに、パイプでfind "AAA"とつなげて、AAAを含むものだけ取り出す。

この結果を変数に入れて、「move (ファイルのフルパス) (移動先のフォルダ)」でファイルを移動させれば良い。
作成したバッチファイルのコードが下のもの。

echo off

set movedFolder="C:\Users\user01\Web\it\Batch\Folder\Moved"
if not exist %movedFolder% (mkdir %movedFolder%)

set /a n=0

setlocal enabledelayedexpansion 
for /f "delims=" %%A in ('"dir /s /b | find "AAA""') do (
  set "line[!n!]=%%A"
  set /a n=n+1
)

for /l %%m in (0,1,%n%) do (
    echo !line[%%m]!
    move /-Y !line[%%m]! %movedFolder%
)

lineという変数にdir /s /b | find "AAA"の出力結果を1行ずつ入れているが、setlocal enabledelayedexpansionを入れておかないとnの数が増えない(無しだとfor文が終わった後に反映されるよう)。その後、もう一度for文を使って、対象のファイルをmoveさせている。オプションの/-Yは、同じファイル名があった場合、上書きするか確認するため。

実行した後のFolder1、新しく作ったMovedのフォルダを見るとAAAのファイルだけ移動していることが分かる。

ファイル名の途中にAAAが入っている場合や特殊な文字の対応など細かく見ていけば、穴はあるだろうけど、たたき台はできた。