上書きせずにファイルを一括コピーして移動する

上書きせずにファイルを一括コピーして移動する

同じ名前の宛先ファイルを上書きせずに単一のファイルをコピーし、そのファイルを移動し、宛先に同じ名前のファイルがある場合は上書きしないバッチ ファイル (バックグラウンドで実行) を作成しようとしています。

今はこれを使っていますが、上書きしてしまいます。

copy %1 dest
move %1 dest

答え1

これを試してみてください。単一のファイルに対して機能します。

エコー N | コピー /-Y ファイル1 ファイル2

エコー N | 移動 /-Y ファイル1 ファイル2

興味深いことに、ワイルドカードでも動作するようです。x64 Windows 7 でテストしました。

答え2

コピーしたばかりの同じファイルを移動するとはどういう意味かよくわかりませんが、ファイルが存在するかどうかをテストするには、次のようなバッチ スクリプトで "IF" ステートメントを使用します。(%~ については後で詳しく説明します。)

IF EXIST %~dp2%~nx1 (echo file exists) ELSE (
robocopy %~dp1 %~dp2 %~nx1 /XN /XO /MOV>>testing.txt)

以下は、Windows 7、Windows 8、Windows Server 2008、Windows Server 2008 R2、Windows Server 2012 で動作します。

(XP の場合はリソース キットから取得する必要がありますが、残念ながらその宝石の有効期限は 30 日しかありません :) )

次のコードは、宛先ファイルが存在しない場合にのみ、ソース ディレクトリから宛先ディレクトリにファイルをコピーします。

robocopy source_path dest_path filename /XN /XO

/MOV を追加するとファイルが移動します。

パラメータを使用する場合、コマンドは次のようになります。

copyscript.bat C:\Dir1\filename.ext D:\path2\

copyscript.bat は次のようになります:

robocopy %~dp1 %~dp2 %~nx1 /XN /XO

出力をログに送信する場合は、次のように >>logfile.txt を追加します。

robocopy %~dp1 %~dp2 %~nx1 /XN /XO>>logfile.txt 

ファイルをコピーするのではなく移動する場合は、次のようにします。

robocopy %~dp1 %~dp2 %~nx1 /XN /XO /MOV 
  • %~dp1は、1番目のパラメータのディレクトリとパスに相当します。
  • %~dp2は2番目のパラメータのディレクトリとパスに相当します
  • %~nx1は、最初のパラメータのファイル名と拡張子に相当します。
  • /XN コピー中に新しいファイルを除外します
  • /XO コピー中に古いファイルを除外します
  • /MOV ファイルをコピーする代わりに移動させます
  • 出力結果を cmd ウィンドウではなくファイルに追加します (毎回ログを上書きする場合は、> を 1 つだけ使用してください)

  • デフォルトでは、robocopy は日付タイムスタンプが同じ場合、ファイルを上書きしません。

Simon Sheppard のサイトはバッチ スクリプトの優れたリソースであり、引数の構文はここにあります。 http://ss64.com/nt/syntax-args.html

Microsoft の robocopy 情報はこちらhttp://technet.microsoft.com/en-us/library/cc733145.aspx

関連情報