Câu hỏi Sao chép tệp mà không ghi đè


Tôi dường như không thể tìm thấy một 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 đến 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à đừng nhắc tôi. "

Tôi đã được thông qua bản sao, 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 tin mới hơn với các tập tin cũ," nhưng điều đó không 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 vào sự kiện sau xây dựng trong Visual Studio 2010 để các tệp được tạo từ T4 mẫu cho mới EF các đối tượng mô hình được phân phối tới các thư mục dự án mà chúng 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 đè lên các tệp đích có khả năng đã chỉnh sửa.

Kể từ khi mẫu T4 tái tạo, 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 ra 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ự mà họ đã giải quyết?


75
2017-11-19 19:50


gốc


Bạn có quen thuộc không cmd.exe'S for chỉ huy? Nếu không, tôi khuyên bạn nên chạy for /? và sử dụng nó. - Gabe


Các câu trả lời:


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

31
2017-11-19 20:04



Đ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
Cái gì ~nx trong %~nxF chính xác là gì? - Serge Rogatch
@Serge: câu chuyện dài. Chạy vì /? để đọc nó. - Stu
@stu, nó chỉ nói rằng đối với ~nxF biến F chuyển thành tên tệp và tiện ích mở rộng. - Serge Rogatch
Có, rất hiệu quả, hãy cho tôi tên tệp + phần mở rộng, không có đường dẫn - đó là những gì bạn cần làm trong bài kiểm tra trong thư mục đích và chỉ định tên tệp đích. Vấn đề là% F bao gồm đường dẫn, và bạn không muốn nó ở đó. - Stu


Robocopy, hoặc "Bản sao tệp mạnh mẽ", là một lệnh sao chép thư mục dòng lệnh. Nó đã 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 câu trả lời của Hydrargyrum, HailGallaxar và Andy Schmidt):

  • /E làm cho Robocopy đệ quy sao chép các thư mục con, bao gồm cả những cái trống.
  • /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 ở đích danh mục. Robocopy bình thường ghi đè chúng.
  • /XO không bao gồm các tệp hiện có cũ hơn so với bản sao ở đích danh mục. Robocopy bình thường ghi đè chúng.

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 ban đầu muốn - mà không cần tải môi trường kịch bản.

Tham khảo: Technet, Wikipedia
Tải xuống từ: Liên kết tải xuống của Microsoft  (Liên kết được xác minh lần cuối vào ngày 30 tháng 3 năm 2016)


159
2017-11-19 20:05



Bằng cách 'loại trừ', bạn có nghĩa là 'bỏ qua' hoặc 'xóa / xóa' không? - Andy Terra
@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
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. - Henno Vermeulen


Giải pháp của Belisarius là tốt.

Để xây dựng trên câu trả lời hơi ngắn gọn đó:

  • /E làm cho Robocopy đệ quy sao chép các thư mục con, bao gồm cả những cái trống.
  • /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 nguồn danh mục. Robocopy bình thường ghi đè chúng.
  • /XO không bao gồm các tệp hiện có cũ hơn so với bản sao trong nguồn danh mục. Robocopy bình thường ghi đè chúng.

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 ban đầu muốn - mà không cần tải môi trường kịch bản.


41
2017-12-06 08:17





Bạn có thể thử điều này:

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

-y chỉ đơn giản là nhắc nhở trước khi ghi đè và chúng tôi có thể ống n 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. :)


33
2018-05-22 16:14



Thật tuyệt. Không biết Windows có thể ống như thế này. - avp
Đẹp đơn giản. - Holf
Nên được chấp nhận trả lời - Cron Merdek
tại sao nó trả lời tất cả các câu hỏi khi chúng ta chỉ một lần? - phuclv
Tuyệt vời, tôi đã đi với tùy chọn này. Trước khi nghĩ về đường ống, tôi googled cho một tham số tôi nghĩ rằng tôi đã mất tích và sau đó tôi đi qua trang này. Thử giải pháp này tôi nhận thấy rằng khi đường ống, bản sao rõ ràng cho phép tham số / Y, vì vậy đó là lý do tại sao / -Y phải được thêm vào. - Andrew


Ở đây nó ở dạng tập tin batch:

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

5
2017-11-19 20:06



Đây sẽ là câu trả lời hàng đầu ... - thab
Ah, tôi thích các chuỗi như %\%%~ rất nhiều".... - avp


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 nhiều n dưới dạng tệp bạn đang sao chép và nó sẽ trả lời n cho tất cả các câu hỏi ghi đè.


3
2018-03-23 18:19



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


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 loại trừ các tệp 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 Nơi Đến danh mục. XO thực hiện "eXclude Older", nhưng nó loại trừ các tệp cũ hơn bản sao trong Nơi Đến danh mục.

Tất nhiên làm kiểm tra của riêng bạn như mọi khi.


2
2018-04-16 12:40



Đây có phải là câu trả lời cho câu hỏi gốc hoặc nhận xét về câu trả lời của người khác không? - ASGM
Câu trả lời của Hydrargyrum có +25 phiếu bầu thời gian viết câu trả lời cho câu hỏi ban đầu, hay nhận xét về câu trả lời của người khác? - mo.


robocopy src dst /MIR /XX

/ XX: eXclude "eXtra" tệp và thư mục (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)


2
2018-02-12 16:13





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

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

Hãy nhớ đặt đường dẫn của bạn tới 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.

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


1
2018-04-09 15:37