2010-11-19 52 views
72

Tôi không thể tìm cách trên dòng lệnh để nói "sao chép tất cả các tệp từ thư mục A vào thư mục B, nhưng nếu tệp đã tồn tại trong thư mục B, đừng ghi đè lên nó , bất kể tệp nào mới hơn và không nhắc tôi. "Sao chép tập tin mà không ghi đè lên

Tôi đã được sao chép, di chuyển, xcopy & robocopy và gần nhất tôi có thể nhận được là bạn có thể nói robocopy "sao chép A đến B, nhưng không ghi đè lên các tệp mới hơn với các tệp cũ", nhưng doesn ' t làm việc cho tôi. Tôi nhìn vào xxcopy, nhưng loại bỏ nó, vì tôi không muốn có sự phụ thuộc của bên thứ ba vào một sự kiện xây dựng sau Visual Studio sẽ yêu cầu người dùng SVN khác cài đặt công cụ đó để thực hiện việc xây dựng.

Tôi muốn thêm một dòng lệnh để sự kiện sau xây dựng trong Visual   Studio   2010 để các tập tin được tạo ra từ các T4 mẫu cho các đối tượng mới EF mô hình được phân phối cho các thư mục dự án mà họ thuộc về, nhưng các tệp đã được tạo lại cho các đối tượng hiện có không ghi đè các tệp đích có thể đã chỉnh sửa.

Vì mẫu T4 tạo lại, tệp nguồn luôn mới hơn và tôi không thể sử dụng công tắc "mới hơn" đáng tin cậy, tôi không nghĩ vậy.

Tôi sử dụng các lớp một phần cho những mục mà tôi có thể, nhưng có những thứ khác tôi tạo không thể sử dụng các lớp từng phần (ví dụ: tạo tệp EditorTemplate hoặc DisplayTemplate * .ascx mặc định).

Bất kỳ ai có bất kỳ vấn đề tương tự nào họ đã giải quyết?

+0

Bạn có quen thuộc với lệnh 'for' của' cmd.exe' không? Nếu không, tôi khuyên bạn nên chạy 'for /?' Và sử dụng nó. – Gabe

Trả lời

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

Điều này làm việc cho tôi, nhưng tôi đã phải sử dụng hai phần trăm biểu tượng thay vì một như tôi đã chạy này từ bên trong một tập tin thực thi hơn là dòng lệnh. Tôi đã thay thế các thể hiện của% F bằng %% F và các thể hiện của% ~ nxF bằng %% ~ nxF. – Owen

+0

'~ nx' trong'% ~ nxF' có nghĩa là gì? –

+0

@Serge: câu chuyện dài. Chạy vì /? để đọc nó. – Stu

151

Robocopy, hoặc "File mạnh mẽ Copy", là một dòng lệnh sao chép thư mục lệnh. Đã có sẵn như là một phần của Windows Resource Kit bắt đầu với Windows NT 4.0, và được giới thiệu như là một tính năng tiêu chuẩn của Windows Vista, Windows 7 và Windows Server 2008.

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

Để xây dựng (sử dụng Hydrargyrum , HailGallaxar và Andy Schmidt trả lời):

  • /E làm Robocopy đệ quy copy thư mục con, bao gồm cả những sản phẩm nào.
  • /XC loại trừ các tệp hiện có với cùng một dấu thời gian, nhưng khác nhau kích thước tệp. Robocopy thường ghi đè lên.
  • /XN loại trừ các tệp hiện có mới hơn so với bản sao trong thư mục đích đến . Robocopy bình thường sẽ ghi đè lên.
  • /XO loại trừ các tệp hiện có cũ hơn so với bản sao trong thư mục đích đến . Robocopy bình thường sẽ ghi đè lên.

Với các lớp đã thay đổi, cũ hơn và mới hơn bị loại trừ, Robocopy thực hiện chính xác những gì mà người đăng gốc muốn - mà không cần tải môi trường tập lệnh.

Tài liệu tham khảo: Technet, Wikipedia
Tải về từ: Microsoft Download Link(Link xác minh lần cuối vào ngày 30 tháng 2016)

+0

Bằng cách 'loại trừ', bạn có nghĩa là 'bỏ qua' hoặc 'xóa/xóa' không? –

+0

@Andre Terra: Bỏ qua, bình thường. Nếu bạn đang sử dụng cờ/MIR, nó có thể xóa chúng. Tôi chưa thử nghiệm điều đó. – Hydrargyrum

+0

Với/MIR, các tệp không tồn tại trong nguồn thực sự bị xóa. Nhưng khi cũng sử dụng/XN và/XO, các tệp tồn tại ở cả hai vị trí chỉ đơn giản là bị bỏ qua (không chắc chắn liệu kích thước có được chọn) hay không. Điều này lý tưởng cho tình huống của tôi, nơi tôi cần phải sao chép phiên bản mới hơn hoặc cũ hơn của ứng dụng của tôi, nhưng tem ngày của các thư viện mà ứng dụng sử dụng không chính xác nhưng tên tệp của chúng chứa số phiên bản của chúng. –

5

Ở đây nó là ở dạng tập tin thực thi:

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

Đây phải là câu trả lời hàng đầu ... – thab

+0

Ah, tôi thích các chuỗi như '% \ %% ~' vậy "nhiều" .... – avp

41

Belisarius' Giải pháp là tốt.

Để xây dựng trên rằng câu trả lời ngắn gọn nhẹ:

  • /E làm Robocopy đệ quy copy thư mục con, bao gồm cả những sản phẩm nào.
  • /XC loại trừ các tệp hiện có với cùng một dấu thời gian, nhưng khác nhau kích thước tệp. Robocopy thường ghi đè lên.
  • /XN loại trừ các tệp hiện có mới hơn so với bản sao trong thư mục nguồn . Robocopy bình thường sẽ ghi đè lên.
  • /XO loại trừ các tệp hiện có cũ hơn so với bản sao trong thư mục nguồn . Robocopy bình thường sẽ ghi đè lên.

Với các lớp đã thay đổi, cũ hơn và mới hơn bị loại trừ, Robocopy thực hiện chính xác những gì mà người đăng gốc muốn - mà không cần tải môi trường tập lệnh.

1

Có thể tải xuống Robocopy tại đây cho các hệ thống chưa được cài đặt. (Tức là Windows Server 2003.)

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=17657 (không khởi động lại cần thiết để cài đặt)

Hãy nhớ để thiết lập đường dẫn của bạn đến exe robocopy. Bạn làm điều này bằng cách nhấp chuột phải vào "máy tính của tôi"> thuộc tính> nâng cao> "Biến môi trường", sau đó tìm biến hệ thống đường dẫn và thêm vào cuối: "; C: \ Program Files \ Windows Resource Kits \ Tools" hoặc bất cứ nơi nào bạn cài đặt nó. Hãy chắc chắn để lại các chuỗi biến đường dẫn đã có và chỉ chắp thêm đường dẫn bổ sung.

khi đường dẫn được đặt, bạn có thể chạy lệnh mà belisarius gợi ý. Nó hoạt động tuyệt vời.

2

Tôi chỉ muốn làm rõ điều gì đó từ thử nghiệm của riêng tôi.

@Hydrargyrum đã viết:

  • /XN không bao gồm các file hiện có mới hơn bản sao trong thư mục nguồn. Robocopy thường ghi đè lên.
  • /XO loại trừ các tệp hiện có cũ hơn bản sao trong thư mục nguồn. Robocopy thường ghi đè lên.

Điều này thực sự là ngược. XN thực hiện các tệp "eXclude Newer" nhưng nó loại trừ các tệp mới hơn bản sao trong thư mục đích đích.XO thực hiện "eXclude Older" nhưng nó loại trừ các tệp cũ hơn bản sao trong thư mục đích đích.

Tất nhiên làm xét nghiệm của riêng bạn như mọi khi.

+1

Đây có phải là câu trả lời cho câu hỏi gốc hay nhận xét về câu trả lời của người khác ? – ASGM

+1

Câu trả lời của Hydrargyrum có +25 phiếu bầu thời điểm viết câu trả lời cho câu hỏi ban đầu, hoặc nhận xét về câu trả lời của người khác? –

30

Bạn có thể thử này:

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

-y chỉ đơn giản nhắc trước khi ghi đè lên và chúng ta có thể n ống cho tất cả những câu hỏi đó. Vì vậy, điều này trong bản chất chỉ cần sao chép các tập tin không tồn tại. :)

+0

Thật tuyệt. Không biết Windows có thể ống như thế này. – avp

+1

Đẹp đơn giản. – Holf

+0

Nên được chấp nhận trả lời –

2

Có một cách kỳ lạ để làm điều này với xcopy:

echo nnnnnnnnnnn | xcopy /-y source target 

Chỉ cần bao gồm càng nhiều n như file bạn đang sao chép, và nó sẽ trả lời n cho tất cả các câu hỏi ghi đè.

+0

Đó là một trò đùa, nhưng nó hoạt động. (Tôi đã sử dụng bản sao.) –

1

Nó sẽ không cho phép tôi bình luận trực tiếp trên các thông điệp không chính xác - nhưng hãy để tôi cảnh báo mọi người, rằng định nghĩa của/XN và/XO tùy chọn được đảo ngược so với những gì đã được đăng trong các tin nhắn trước đó.

Tùy chọn loại trừ cũ hơn/mới hơn phù hợp với thông tin được hiển thị trong nhật ký của RoboCopy: RoboCopy sẽ lặp qua SOURCE và sau đó báo cáo liệu mỗi tệp trong SOURCE là "OLDER" hay "NEWER" so với tệp trong đích .

Do đó,/XO sẽ loại trừ các tệp OLDER SOURCE (trực quan), chứ không phải "cũ hơn nguồn" như đã được xác nhận ở đây.

Nếu bạn chỉ muốn sao chép các tệp nguồn mới hoặc đã thay đổi, nhưng tránh thay thế các tệp đích gần đây hơn, thì/XO là tùy chọn đúng để sử dụng.

0

Cách tiếp cận đơn giản là sử dụng tùy chọn/MIR, để phản chiếu hai thư mục. Về cơ bản nó sẽ chỉ sao chép các tập tin mới đến đích. Trong phần comand tiếp theo thay thế nguồn và đích bằng đường dẫn đến thư mục của bạn, tập lệnh sẽ tìm kiếm bất kỳ tệp nào có bất kỳ tiện ích mở rộng nào.

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

Đây là những gì đã làm việc cho tôi. Tôi sử dụng điều này để "thêm" các tập tin trên ổ đĩa khác, không có ghi đè.

tập tin Batch: 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" 

Ví dụ:

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

Làm xét nghiệm trước khi thực hiện.

2
robocopy src dst /MIR /XX 

/XX: eXclude "eXtra" tệp và dir (có ở đích nhưng không phải nguồn). Điều này sẽ ngăn chặn mọi việc xóa khỏi điểm đến. (đây là mặc định)

Các vấn đề liên quan