web-dev-qa-db-ja.com

上書きせずにファイルをコピーする

コマンドラインで「ディレクトリAからディレクトリBにすべてのファイルをコピーする方法を見つけることができないようですが、ファイルがディレクトリBに既に存在する場合は、どのファイルが新しくても上書きしないでください。 、プロンプトを表示しないでください。」

コピー、ムーブ、xcopy、robocopyを使用しましたが、最も近い方法は、robocopyに「AからBにコピーしますが、新しいファイルを古いファイルで上書きしないでください」と言うことですが、それではうまくいきません。 。 xxcopyを調べましたが、Visual Studioのビルド後イベントにサードパーティの依存関係を持たせたくないので、他のSVNユーザーがビルドを行うためにそのツールをインストールする必要があるため、それを破棄しました。

Visual Studio 2010のビルド後イベントにコマンドラインを追加して、 T4 新しいテンプレート用のテンプレート EF モデルオブジェクトが生成されるようにします所属するプロジェクトフォルダに配布されますが、既存のオブジェクト用に再生成されたファイルは、編集される可能性のある宛先ファイルを上書きしません。

T4テンプレートが再生成されるため、ソースファイルは常に新しいものになり、「新しい」スイッチを確実に使用することはできません。

私は可能な項目に対して部分クラスを使用しますが、部分クラスを使用できない他の生成物があります(たとえば、デフォルトのEditorTemplateまたはDisplayTemplate * .ascxファイルの生成)。

解決した類似の問題はありますか?

89
Tony
For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF"
34
Stu

Robocopy、または「Robust File Copy」は、コマンドラインのディレクトリ複製コマンドです。 Windows NT 4.0以降のWindowsリソースキットの一部として利用でき、Windows Vista、Windows 7、およびWindows Server 2008の標準機能として導入されました。

   robocopy c:\Sourcepath c:\Destpath /E /XC /XN /XO

詳しく説明するには(Hydrargyrum、HailGallaxar、およびAndy Schmidtの回答を使用):

  • /Eは、空のサブディレクトリを含むサブディレクトリをRobocopyに再帰的にコピーさせます。
  • /XCは、タイムスタンプは同じでファイルサイズが異なる既存のファイルを除外します。通常、Robocopyはそれらを上書きします。
  • /XNは、コピー先ディレクトリのコピーよりも新しい既存のファイルを除外します。通常、Robocopyはそれらを上書きします。
  • /XOは、コピー先ディレクトリのコピーより古い既存のファイルを除外します。通常、Robocopyはそれらを上書きします。

Changed、Older、およびNewerクラスを除外すると、Robocopyは、スクリプト環境をロードする必要なく、元のポスターが望むことを正確に実行します。

参照: TechnetWikipedia
ダウンロード元: Microsoftダウンロードリンク(リンクは2016年3月30日に最後に確認されました)

182
Dr. belisarius

ベリサリウスの解決策は良いです。

その少し簡潔な答えを詳しく説明するには:

  • /Eは、空のサブディレクトリを含むサブディレクトリをRobocopyに再帰的にコピーさせます。
  • /XCは、タイムスタンプは同じでファイルサイズが異なる既存のファイルを除外します。通常、Robocopyはそれらを上書きします。
  • /XNは、ソースディレクトリのコピーよりも新しい既存のファイルを除外します。通常、Robocopyはそれらを上書きします。
  • /XOは、ソースディレクトリのコピーより古い既存のファイルを除外します。通常、Robocopyはそれらを上書きします。

Changed、Older、およびNewerクラスを除外すると、Robocopyは、スクリプト環境をロードする必要なく、元のポスターが望むことを正確に実行します。

44
Hydrargyrum

これを試すことができます:

echo n | copy /-y <SOURCE> <DESTINATION>

-yは単に上書きする前にプロンプ​​トを表示するだけであり、これらすべての質問にnをパイプすることができます。したがって、これは本質的に、存在しないファイルをコピーするだけです。 :)

39
sachin11

これはバッチファイル形式です。

@echo off
set source=%1
set dest=%2
for %%f in (%source%\*) do if not exist "%dest%\%%~nxf" copy "%%f" "%dest%\%%~nxf"
6
Gabe

Xcopyを使用してこれを行う奇妙な方法があります。

echo nnnnnnnnnnn | xcopy /-y source target

コピーするファイルと同じ数のnを含めるだけで、すべての上書き質問にnと答えます。

3
Adam Ruth
robocopy src dst /MIR /XX

/ XX:「eXtra」ファイルとディレクトリを除外します(宛先には存在しますが、ソースには存在しません)。これにより、宛先からの削除が防止されます。 (これがデフォルトです)

3
be_good_do_good

私は自分のテストから何かを明確にしたいだけです。

@Hydrargyrumの書き込み:

  • / XNは、ソースディレクトリのコピーよりも新しい既存のファイルを除外します。通常、Robocopyはそれらを上書きします。
  • / XOは、ソースディレクトリのコピーよりも古い既存のファイルを除外します。通常、Robocopyはそれらを上書きします。

これは実際には逆です。 XNは「eXclude Newer」ファイルを実行しますが、destinationディレクトリ内のコピーよりも新しいファイルを除外します。 XOは「eXclude Older」を行いますが、destinationディレクトリ内のコピーよりも古いファイルを除外します。

もちろん、いつものように独自のテストを行います。

3
HailGallaxar

Robocopyは、まだインストールされていないシステム用にここからダウンロードできます。 (つまり、Windows Server2003。)

http://www.Microsoft.com/download/en/details.aspx?displaylang=en&id=17657 (インストールに再起動は不要)

Robocopy exeへのパスを忘れずに設定してください。これを行うには、[マイコンピュータ]> [プロパティ]> [詳細設定]> [環境変数]を右クリックし、パスシステム変数を見つけて最後に追加します: "; C:\ Program Files\Windows Resource Kits\Tools"またはどこでもそれをインストールしました。すでに存在するパス変数文字列を残し、追加のパスを追加するだけにしてください。

パスが設定されると、belisariusが提案するコマンドを実行できます。それは素晴らしい作品です。

1
Greg

間違ったメッセージに直接コメントすることはできませんが、/ XNおよび/ XOオプションの定義は前のメッセージで投稿されたものと比較して逆になっていることを全員に警告させてください。

[古い/新しいファイルを除外]オプションは、RoboCopyのログに表示される情報と一致しています。RoboCopyはSOURCEを反復処理し、SOURCEの各ファイルが宛先のファイルより「古い」または「新しい」かどうかを報告します。

その結果、/ XOは、ここで主張された「ソースより古い」ではなく、(直感的な)古いソースファイルを除外します。

新しいソースファイルまたは変更されたソースファイルのみをコピーするが、最新の宛先ファイルを置き換えないようにする場合は、/ XOを使用するのが適切なオプションです。

1
Andy Schmidt

これは私のために働いたものです。これを使用して、上書きせずにファイルを他のドライブに「追加」します。

バッチファイル:robocopy-missingfiles.bat

@echo off
echo Copying 
echo      "%1"
echo   to "%2"
echo.
echo Press Cntr+C to abort
Pause
echo.
@echo on
robocopy %1 %2 /Xo /XN /XC /J /SL /S /MT:8 /R:1 /W:1 /V /DCOPY:DAT /ETA /COPY:DATO /FFT /A-:SH /XD $RECYCLE.BIN "System Volume Information"

例:

robocopy-missingfiles.bat f:\Working-folder\ E:\Backup-folder\

実装前にテストを行います。

0
Ramesh

簡単な方法は、/ MIRオプションを使用して、2つのディレクトリをミラーリングすることです。基本的に、新しいファイルのみをコピー先にコピーします。次のコマンドでは、ソースと宛先をフォルダーへのパスに置き換え、スクリプトは拡張子を持つファイルを検索します。

robocopy <source directory> <destination directory> *.* /MIR
0
Ionut V.