MSDOSバッチでファイル移行(フォルダ構成も変更)


はじめに

ファイルのサーバー(NAS等も含む)移行は、案外大変です。
コピるだけだろーと思っていると、大変な目にあったという経験がある方もいらっしゃるかと思います。
フォルダ構成をそのまま移動するときは、WINDOWS系ならロボコピーがお勧めです。
※ロボコピーを使うときは移動元と移動先の設定だけは、くれぐれも逆にしないよう要注意してください。

今回は、フォルダ構成を変えながらファイルを移動するDOSバッチを作成したので、備忘録的に記述します。

前提

特定の書類ファイルがドーンと同じフォルダに大量(エクスプローラーが固まるくらい)に置いてあるとして、少しだけフォルダ構成を変えて整理しながら移動していくDOSバッチを作りました。

概要
下記のように移動先は、root連番フォルダの間に
連番フォルダの左3桁でフォルダを挟むようにしてコピーしていきます。
※大量のフォルダが、少し探しやすい構成になるかなと。

・移動元フォルダ
 root\連番フォルダ\連番ファイル.xxx
・移動先フォルダ
 root\連番(左3桁)\連番フォルダ\連番ファイル.xxx

ファイル移動

出来るだけシンプルな命令で、処理することにしています。
copyコマンドは、xcopyを使っています。
xcopyはオプションで作成日付を維持したいなどの要望がある程度カバーできるので、調整してくださいね。あと、ネットワーク越しのコピーもできます。

大量フォルダの移動なので、分割実行も考えて小さい単位の処理とします。
一発で出来るんですが、そこはご容赦ください。
どのくらいの量を1回のコマンドで処理するかを環境と相談して決めてください。

例は、600番台~609番台のフォルダの移動について記述していきます。

①パスの設定
②フォルダ作成
③フォルダ移動
 1フォルダずつ、一個一個コピーしていきます。
※バッチの実行はcdコマンドで移動元のフォルダに移動して実行することとします。

@echo off
echo *********************************
echo ①パスの設定
echo *********************************
echo 移動元(from)
set FROM_PATH=D:\テスト\root_from
echo 移動先(to)
set TO_PATH=\\[IPアドレス]\root_to\

echo コピー元:%FROM_PATH%
echo コピー先:%TO_PATH%
pause
echo *********************************
echo %date% %time% 開始600番台~609番台
echo *********************************
echo ②フォルダ作成
for /l %%i in (0,1,9)   do ( for /d %%j in (60%%i*) do (if not exist %TO_PATH%\60%%i mkdir %TO_PATH%\60%%i))
echo ③フォルダ移動
for /l %%i in (0,1,9)   do ( for /d %%j in (60%%i*) do (if %%j neq 60%%i xcopy /D /E /Y %FROM_PATH%\%%j %TO_PATH%\60%%i\%%j\))
echo *********************************
echo %date% %time% 終了600番台~609番台
echo *********************************
echo *********************************
echo %date% %time% 終了しました
echo *********************************
pause

ぱっとみて気づいた方もいるかもですが、②のフォルダ作成は無駄にループしていて冗長ですね。
一応意図があって、抜け番号帯があるときに無駄にフォルダを作らないようにしています。
※内容更新が停止されていて動かないなら、フォルダは事前に作っちゃっうといいですね。

説明

目的のコマンドは、フォルダ移動なので③の部分を切り出して説明します。

echo ③フォルダ移動
for /l %%i in (0,1,9) do ( for /d %%j in (60%%i*) do (if %%j neq 60%%i xcopy /D /E /Y %FROM_PATH%\%%j %TO_PATH%\60%%i\%%j))

一行で書いていて見通しよくするために、細かく改行していきます。
//でコメントの意味で説明を書きます。

//0から増分1で9までループ
for /l %%i in (0,1,9)   do (
  //移動元からフォルダの左3桁が「600*~609*」のフォルダ名を探すループ
  //60%%iが600の場合、%%jには「600*」のフォルダ名が1つずつ取得されます。
  for /d %%j in (60%%i*) do (
    //取得した%%jが60%%iと不一致なら、XCOPYを実行します。
    //「if %%j neq 60%%i」は、常に成立しますね。※3桁のフォルダは無い前提です。
    //[for do]を使っている関係で、xcopyコマンドだけでは実行できなかったんです。
    //他にいい方法があれば、変更してください。
    if %%j neq 60%%i xcopy /D /E /Y %FROM_PATH%\%%j %TO_PATH%\60%%i\%%j\
  )
)

以上ですが、参考になれば幸いです。