前回の記事でwhereコマンドの結果をExcel上に貼り付けて、
出力内容を項目別にセルへ展開する関数を仕込んだファイルリストの作成をExcelで行いました。
リストを使ってファイル管理_whereコマンドとエクセル関数を組み合わせてファイルリストを作る
↑前回の記事です。
ニッチな状況かもしれませんが、
各ファイルを所定のフォルダへディレクトリ構成を維持して
移動したい場合に便利な方法を提案したいと思います。
コマンドプロンプトを使って一気に移動させることができるのでコマンドを作成する関数を
加えていきましょう。
※コピーではなくて移動の話をしますので移動元にファイルは残りません。注意してください。
※ちなみにディレクトリ構成を新たに作成してファイルをコピーする場合はcopyコマンドやxcopyコマンドを使用します。
まずは具体的にどうしたいかを図示します。
以下のようにデスクトップの配下にtestA,testB,testCというフォルダがあり
それぞれの内部にファイルやさらにフォルダがあるような構成を例に話をしていきます。
ファイルだけを移動するならファイルリストで出力したファイルを手あたり次第moveコマンドを実行して移動していけばいいですが
もともとどんな名前のフォルダに入っていたのか、維持して移動させてたい場合が多いと思いますので以下の図のように
もともとのフォルダ構成を移動先に作成してその配下に正確にファイルを配置していきます。
ファイルリストへ新たに関数を組み込んでいく
今回は前回作ったリストの右にコマンド作成のための関数を入れます。
まずはI2に「移動先フォルダ→」、J2に移動先のパスを入れています。
移動コマンドではこのパスの配下にもともとのディレクトリを生成していきます。
I列は共通という項目名にしています。今回はc:\users\akabode\desktopの配下にあるフォルダの中のファイルを移動させていきたいので
ファイルが配置されているdesktop以降のパスを関数で呼び出します。
J列はディレクトリを作り上げるためのコマンドです。mkdirコマンドでフォルダを作成していきます。これは移動先のパス配下にI列のパスを組み合わせて作成します。同一フォルダが自分のセルより上で作成されているようであれば表示しないように関数を組んでいます。
K列は実際にファイルを移動していくmoveコマンドを生成します。
move 移動元\ファイル名 移動先フォルダ名 という構文です。上の図では右のほうが切れてしまっていますのでK列のアップを
貼っておきます。
前回作成しているファイルリストではF列にフルパスを用意しているのでconcatenateを使って
=concatenate(“move “,F列のセル,” “,移動先のパス,I列の結果)といった具合ですね。
以下関数の一覧となります。
=RIGHT(G4,LEN(G4)-25)
※-25は今回desktop\までの文字数が固定なのでその文字数分です。実際の環境に合わせて移動先フォルダの配下に作りたいフォルダ名が出力されるようにご自身の環境で調整してください。
②フォルダ作成コマンド
=IF(COUNTIF($G1:G3,G4)>=1,””,CONCATENATE(“mkdir “,$J$2,”\”,I4))
※IF(COUNTIF(の部分が自分のセルより上で同じフォルダを作成するコマンドが生成されている場合は空白で返すという部分ですね。
G列がwhereコマンドの結果からファイルのパスだけを出力するコマンドが入れているので、ここが同一のものが自分より上にあればcountifで1を返してくるので1だったら””で空欄を返す。なければconcatenateコマンドを発動させるという感じです。
③移動コマンド
=CONCATENATE(“move “,F4,” “,CONCATENATE($J$2,”\”,I4))
※これでmoveコマンドが出てきます。
以上!!!
あとはコマンドプロンプトにJ列の内容を貼り付けて実行してフォルダが作成されたことを確認したら
K列の内容を貼り付けて移動完了です。コマンドが間違っていると当然エラーを返してくるので2-3行で試して問題なさそうなら
続きを貼り付けると良いと思います。
batファイルを作ることでより流動的に処理ができますが、関数でコマンドが勝手に出来上がるしこの程度の処理ならbatを作るほうが
手間かもしれませんね。
念を押しておきますがあくまでこれは移動に関する話です。もともとのファイルの置き場所も維持してそれをコピーしたいという場合は
この方法を使わないようにしてください。
コメント