robocopy:ファイルとフォルダを移動する際の注意点

robocopyを使ってファイル/フォルダーを転送するプログラムを書いたときに両ファイルが混合するとうまく転送ができなく生き詰まっていたが、オプションを理解することで仕組みが分かったので共有したいと思います。

@echo off
@REM chcp 65001 >nul
setlocal enabledelayedexpansion

for %%F in (%*) do (
    @REM echo %%~F
    set "filename=%%~nxF"

    if exist "%%~F\" (
        @REM ディレクトリ
        robocopy "%%~F" "C:\Users\wow\Desktop\!filename!" /move /e
    ) else (
        @REM ファイル
        robocopy "%cd%" "C:\Users\wow\Desktop" "!filename!" /mov
    )
)
pause

shift JISかutf-8で保存するかで動かないのでshiftJIS前提で解説しています。

基本構文 : robocopy

robocopy <コピー元ディレクトリのパスを指定> <コピー先ディレクトリのパスを指定> [ファイルをコピーするファイルを指定] [オプション]

オプションについて

今回使用するオプションは/mov/moveなのでそれ以外は割愛します。

オプション説明
/moveディレクトリとファイルを移動し、コピー後コピー元のディレクトリから削除
/movファイルを移動し、コピー後コピー元のディレクトリから削除

つまり、/moveはディレクトリとファイルを転送するもの。/movはファイルのみを転送するオプションになります。

もし、/movを使いディレクトリを送る場合コピー元のディレクトりはそのままで中身のファイルだけが転送されてしまいます。

さらに注意したいのがファイルのみの送信とディレクトリごとの送信方法のパラメータ設定が異なります。

ディレクトリごと

robocopy "コピー元ディレクトリパス" "コピー先ディレクトリパス\ディレクトリ名" /move /e

ここで注意したいのが"コピー元ディレクトリパス""コピー先ディレクトリパス\ディレクトリ名"の指定です。

"コピー元ディレクトリパス""C:\Users\name\Downloads\005\"となり移動先のディレクトリパスはC:\Users\name\Desktop\005\と指定しなくてはいけません。C:\Users\name\Desktopだけの指定だとコピー元のディレクトリの中身しかコピーしてくれません。

robocopy "C:\Users\name\Downloads\005\" "C:\Users\name\Desktop\005\" /move /e

/move /eとつけることで空ディレクトリやサブディレクトリをコピーしてくれます。

ファイルのみ

robocopy "コピー元ディレクトリパス" "コピー先ディレクトリパス" "ファイル名" /mov

ファイルの場合は送り先のディレクトリパスとファイル名のパラメータの設定で移動ができます。つまり、下記のように記述することでファイルを移動することができます。

robocopy "%cd%" "C:\Users\name\Desktop" "smple.txt" /mov

なのでディレクトリごと転送したい場合は/move /e を使います。ファイルだけを送りたい場合は/movと使い分ける必要があります。

ディレクトリであるかのチェック

ファイルかディレクトリかを見分けるにはif existを使い判断させます。"%%~F\"と記述することでディレクトリ判断ができます。

if exist "%%~F\" (
    @REM ディレクトリ
    robocopy "%%~F" "C:\Users\wow\Desktop\!filename!" /move /e
) else (
    @REM ファイル
    robocopy "%cd%" "C:\Users\wow\Desktop" "!filename!" /mov
)