2010-11-19 94 views
72

我似乎無法在命令行上找到一種方法來說「將所有文件從目錄A複製到目錄B,但是如果文件已經存在於目錄B中,請不要覆蓋它,不管哪個文件更新,也不要提示我。「複製文件沒有覆蓋

我已經通過複製,移動,xcopy & robocopy,而且我能得到的最接近的是你可以告訴robocopy「複製A到B,但不要用較舊的文件覆蓋較新的文件」,但是這並不是'爲我工作。我查看了xxcopy,但放棄了它,因爲我不希望第三方依賴於Visual Studio後構建事件,這將需要其他SVN用戶安裝該工具才能完成構建。

我希望將命令行添加到生成後事件在Visual  工作室  2010,使得從T4模板新EF模型對象生成的文件被分配到其所屬的項目文件夾,但現有對象的重新生成的文件不會覆蓋潛在編輯的目標文件。

由於T4模板再生,源文件始終是新的,我不能用「新」切換可靠,我不認爲。

我對那些可以使用的項目使用了部分類,但還有其他我不能使用部分類的東西(例如,生成默認的EditorTemplate或DisplayTemplate * .ascx文件)。

任何人有任何類似的問題,他們已經解決?

+0

您是否熟悉'cmd.exe'的'for'命令?如果沒有,我建議你運行'for /?'並使用它。 – Gabe 2010-11-19 19:54:52

回答

29
For %F In ("C:\From\*.*") Do If Not Exist "C:\To\%~nxF" Copy "%F" "C:\To\%~nxF" 
+4

這對我有效,但我不得不使用兩個百分比符號而不是一個,因爲我是從批處理文件而不是命令行運行的。我用%% F替換%F的實例,用%%〜nxF替換%〜nxF的實例。 – Owen 2016-06-17 07:37:18

+0

'%〜nxF'中的'〜nx'究竟意味着什麼? – 2016-08-27 17:21:38

+0

@Serge:長故事。運行FOR /?閱讀它。 – Stu 2016-08-29 12:59:02

151

的Robocopy或 「魯棒文件複製」,是一個命令行目錄複製命令。它已經作爲Windows資源工具包開始使用Windows NT 4.0的一部分,並且被介紹爲Windows Vista中,Windows 7和Windows Server的一個標準功能2008

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

爲了詳細說明(使用汞,HailGallaxar和安迪·施密特回答):

  • /E使得遞歸的Robocopy複製子目錄, 包括空的。
  • /XC排除現有的文件與 相同的時間戳,但不同的 文件大小。 Robocopy通常覆蓋這些。
  • /XN排除現有文件比目標 目錄中的副本更新 。 Robocopy通常 覆蓋那些。
  • /XO排除 現有文件舊 比在目的地 目錄中的副本。 Robocopy通常 覆蓋那些。

隨着更改,更舊和更新的類被排除,Robocopy完全按照原始海報的要求 - 無需加載腳本環境。

參考文獻:TechnetWikipedia
下載來自:Microsoft Download Link(鏈接去年03月30覈實,2016)

+0

按'排除'你的意思是'跳過'或'刪除/刪除'? – 2013-10-14 17:37:21

+0

@Andre Terra:通常跳過。如果您使用/ MIR標誌,則可能會將其刪除。我沒有測試過。 – Hydrargyrum 2013-12-04 23:33:46

+0

使用/ MIR時,源中不存在的文件確實被刪除。但是,當還使用/ XN和/ XO時,兩個地方存在的文件都會被略過(不確定是否檢查了大小)。這對於我需要複製我的應用程序的較新版本或較舊版本但應用程序使用的庫的dateModified郵票不正確但文件名本身包含其版本號的情況非常理想。 – 2015-08-05 11:18:55

5

這是批處理文件的形式:

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

這應該是第一個答案... – thab 2016-02-18 22:04:47

+0

啊,我喜歡像'%\ %%〜'這樣的「很多」的序列...... – avp 2016-08-26 13:17:01

41

貝利薩留的解決方案是好。

爲了詳細說明稍微簡潔的回答:

  • /E使得遞歸的Robocopy複製子目錄, 包括空的。
  • /XC排除現有的文件與 相同的時間戳,但不同的 文件大小。 Robocopy通常覆蓋這些。
  • /XN排除現有文件比源 目錄中的副本更新 。 Robocopy通常 覆蓋那些。
  • /XO排除 現有文件較舊 比源 目錄中的副本。 Robocopy通常 覆蓋那些。

隨着更改,更舊和更新的類被排除,Robocopy完全按照原始海報的要求 - 無需加載腳本環境。

1

Robocopy可以在此處下載,以查找尚未安裝的系統。 (即Windows Server 2003中)

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17657 (沒有安裝需要重新啓動)

記住您的路徑設置爲ROBOCOPY exe文件。通過右鍵單擊「我的電腦」>屬性>高級>「環境變量」,然後找到路徑系統變量並將其添加到末尾:「; C:\ Program Files \ Windows資源工具包\工具」或無論您身在何處安裝它。確保保留已經存在的路徑變量字符串,並只追加addtional路徑。

一旦設置了路徑,就可以運行belisarius建議的命令。它效果很好。

2

我只是想澄清一下我自己的測試。

@Hydrargyrum寫道:

  • /XN排除比源目錄中的副本更新現有文件。 Robocopy通常覆蓋這些。
  • /XO排除比源目錄中的副本舊的現有文件。 Robocopy通常覆蓋這些。

這實際上是倒退。 XN會「排除較新的」文件,但它會排除比目標目錄中的副本更新的文件。XO確實「排除舊的」,但它排除了比目錄目錄中的副本早的文件。

當然,一如既往地做自己的測試。

+1

這是對原始問題的回答,還是對別人的回答的評論? – ASGM 2013-04-16 13:06:19

+1

Hydrargyrum的答案是,在回答原始問題時還有25票,還是評論他人的答案? – 2013-05-09 22:28:33

30

你可以試試這個:

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

-y覆蓋前簡單的提示,我們可以管N到所有這些問題。所以這實質上就是複製不存在的文件。 :)

+0

很酷。不知道Windows可以這樣管道。 – avp 2016-08-26 13:11:39

+1

非常簡單。 – Holf 2016-11-01 14:25:07

+0

應該被接受回答 – 2017-05-09 14:04:55

2

沒有與XCOPY做到這一種奇怪的方式:

echo nnnnnnnnnnn | xcopy /-y source target 

就包括許多個n爲你複製文件,它會回答n所有的覆蓋問題。

+0

這是一個無聊,但它的作品。 (我用拷貝。) – 2015-05-08 20:20:00

1

它不會讓我直接對不正確的消息發表評論 - 但讓我只是警告所有人,與先前消息中發佈的內容相比,/ XN和/ XO選項的定義是REVERSED。

排除較舊/較新文件選項與RoboCopy記錄中顯示的信息一致:RoboCopy將遍歷SOURCE,然後報告SOURCE中的每個文件是否比目標中的文件「更舊」或「更新」 。

因此,/ XO將排除OLDER SOURCE文件(這很直觀),而不是像這裏聲稱的那樣「比源更老」。

如果您只想複製新的或已更改的源文件,但避免替換更新的目標文件,那麼/ XO是正確的選項。

0

一個簡單的方法是使用/ MIR選項來鏡像兩個目錄。基本上它只會將新文件複製到目的地。在下一個命令中,將源文件和目標文件替換爲文件夾的路徑,該腳本將搜索任何帶有任何擴展名的文件。

robocopy <source directory> <destination directory> *.* /MIR 
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\ 

實施之前做測試。

2
robocopy src dst /MIR /XX 

/XX:eXclude「eXtra」文件和目錄(存在於目的地但不是來源)。這將防止從目的地刪除任何內容。 (這是默認設置)