108

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

私はコピー、移動、xcopy、およびrobocopyを行ってきましたが、最も近いのは、robocopyに「AをBにコピーしますが、新しいファイルを古いファイルで上書きしないでください」と指示できることですが、それはうまくいきません. 私はxxcopyを見ましたが、他のSVNユーザーがビルドを行うためにそのツールをインストールする必要があるVisual Studioビルド後のイベントにサードパーティの依存関係を持ちたくないので、それを破棄しました。

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

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

可能なアイテムには部分クラスを使用しますが、部分クラスを使用できないアイテムが他にも生成されます (たとえば、デフォルトの EditorTemplate または DisplayTemplate *.ascx ファイルの生成)。

同様の問題を解決した人はいますか?

4

12 に答える 12

222

Robocopyまたは「堅牢なファイル コピー」は、コマンドライン ディレクトリ レプリケーション コマンドです。これは、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 の回答を使用):

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

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

参考文献: TechnetWikipedia
ダウンロード元: Microsoft ダウンロード リンク (リンクの最終確認日は 2016 年 3 月 30 日)

于 2010-11-19T20:05:53.183 に答える
48

ベリサリウスのソリューションは優れています。

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

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

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

于 2010-12-06T08:17:39.680 に答える
42
For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF"
于 2010-11-19T20:04:21.890 に答える
6

ここにバッチファイル形式があります:

@echo off
set source=%1
set dest=%2
for %%f in (%source%\*) do if not exist "%dest%\%%~nxf" copy "%%f" "%dest%\%%~nxf"
于 2010-11-19T20:06:49.110 に答える
1

まだインストールされていないシステムの場合は、Robocopy をここからダウンロードできます。(つまり、Windows Server 2003)。

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

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

パスが設定されたら、ベリサリウスが提案するコマンドを実行できます。それはうまくいきます。

于 2012-04-09T15:37:46.050 に答える
1

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

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

したがって、/XO は、ここで主張されていた「ソースよりも古い」ファイルではなく、OLDER SOURCE ファイル (これは直感的です) を除外します。

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

于 2016-05-08T16:49:23.927 に答える
0

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

バッチ ファイル: 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\

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

于 2016-12-14T03:07:46.740 に答える
0

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

robocopy <source directory> <destination directory> *.* /MIR
于 2016-06-17T10:25:57.463 に答える