คัดลอกไฟล์โดยไม่ต้องเขียนทับ


101

ฉันไม่สามารถหาวิธีในบรรทัดคำสั่งเพื่อพูดว่า "คัดลอกไฟล์ทั้งหมดจากไดเร็กทอรี A ไปยังไดเร็กทอรี B แต่ถ้าไฟล์มีอยู่แล้วในไดเร็กทอรี B อย่าเขียนทับไม่ว่าไฟล์ใดจะใหม่กว่า และไม่ต้องแจ้งให้ฉันทราบ "

ฉันเคยผ่านการคัดลอกย้าย xcopy & robocopy และสิ่งที่ใกล้เคียงที่สุดที่ฉันจะได้รับคือคุณสามารถบอก robocopy ว่า "คัดลอก A ถึง B แต่อย่าเขียนทับไฟล์ที่ใหม่กว่าด้วยไฟล์ที่เก่ากว่า" แต่นั่นไม่ได้ผลสำหรับฉัน . ฉันดู xxcopy แต่ทิ้งไปเนื่องจากฉันไม่ต้องการให้บุคคลที่สามต้องพึ่งพาเหตุการณ์หลังการสร้าง Visual Studio ซึ่งจะต้องให้ผู้ใช้ SVN รายอื่นต้องติดตั้งเครื่องมือนั้นเพื่อทำการสร้าง

ฉันต้องการเพิ่มบรรทัดคำสั่งให้กับเหตุการณ์หลังการสร้างใน Visual Studio 2010 เพื่อให้ไฟล์ที่สร้างจากเท็เพลต T4สำหรับอ็อบเจ็กต์โมเดลEFใหม่ถูกแจกจ่ายไปยังโฟลเดอร์โปรเจ็กต์ที่เป็นของ แต่สร้างไฟล์ใหม่สำหรับอ็อบเจ็กต์ที่มีอยู่ อย่าเขียนทับไฟล์ปลายทางที่อาจแก้ไขได้

เนื่องจากเทมเพลต T4 สร้างขึ้นใหม่ซอร์สไฟล์จะใหม่กว่าเสมอและฉันไม่สามารถใช้สวิตช์ "ใหม่กว่า" ได้อย่างน่าเชื่อถือฉันไม่คิดว่า

ฉันใช้คลาสบางส่วนสำหรับรายการเหล่านั้นที่ฉันทำได้ แต่มีสิ่งอื่นที่ฉันสร้างขึ้นที่ไม่สามารถใช้คลาสบางส่วนได้ (เช่นการสร้างไฟล์ EditorTemplate หรือ DisplayTemplate * .ascx เริ่มต้น)

ใครมีปัญหาที่คล้ายกันที่พวกเขาแก้ไข?


คุณคุ้นเคยกับcmd.exe's forคำสั่ง? ถ้าไม่ฉันขอแนะนำให้คุณเรียกใช้for /?และใช้สิ่งนั้น
Gabe

คำตอบ:


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

5
สิ่งนี้ใช้ได้ผลสำหรับฉัน แต่ฉันต้องใช้สัญลักษณ์สองเปอร์เซ็นต์แทนสัญลักษณ์หนึ่งเนื่องจากฉันเรียกใช้สิ่งนี้จากภายในไฟล์แบตช์แทนที่จะเป็นบรรทัดคำสั่ง ฉันแทนที่อินสแตนซ์ของ% F ด้วย %% F และอินสแตนซ์ของ% ~ nxF ด้วย %% ~ nxF
Owen

1
อะไร~nxใน%~nxFว่าหมายความว่าอย่างไร
Serge Rogatch

@stu มันบอกเพียงว่าสำหรับ~nxFตัวแปรFจะเปลี่ยนเป็นชื่อไฟล์และนามสกุล
Serge Rogatch

ใช่แล้วให้ชื่อไฟล์ + นามสกุลโดยไม่มีพา ธ - ซึ่งเป็นสิ่งที่คุณต้องทำการทดสอบในโฟลเดอร์เป้าหมายและระบุชื่อไฟล์เป้าหมาย ประเด็นก็คือ% F มีเส้นทางและคุณไม่ต้องการที่นั่น
สตู

209

robocopy , หรือ "คัดลอกไฟล์ที่แข็งแกร่ง" เป็นคำสั่งบรรทัดคำสั่งการจำลองแบบไดเรกทอรี มีให้ใช้งานเป็นส่วนหนึ่งของ Windows Resource Kit ที่เริ่มต้นด้วย Windows NT 4.0 และได้รับการแนะนำให้ใช้เป็นคุณลักษณะมาตรฐานของ 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 จะเขียนทับสิ่งเหล่านั้น

ด้วยการยกเว้นคลาสที่เปลี่ยนแปลงเก่ากว่าและใหม่กว่า Robocopy จะทำตามที่ผู้โพสต์ต้องการโดยไม่จำเป็นต้องโหลดสภาพแวดล้อมการเขียนสคริปต์

ข้อมูลอ้างอิง: Technet , Wikipedia
ดาวน์โหลดจาก: Microsoft Download Link (ลิงก์ตรวจสอบล่าสุดเมื่อวันที่ 30 มีนาคม 2559)


โดย 'exclude' คุณหมายถึง 'ข้าม' หรือ 'ลบ / ลบ'?
ทางอากาศ

@Andre Terra: ข้ามปกติ หากคุณใช้แฟล็ก / MIR แฟล็กอาจลบออก ฉันยังไม่ได้ทดสอบ
Hydrargyrum

ด้วย / MIR ไฟล์ที่ไม่มีอยู่ในซอร์สจะถูกลบออกไป แต่เมื่อใช้ / XN และ / XO ไฟล์ที่มีอยู่ในทั้งสองแห่งจะถูกข้ามไป (ไม่แน่ใจว่ามีการตรวจสอบขนาดหรือไม่) สิ่งนี้เหมาะสำหรับสถานการณ์ของฉันที่ฉันต้องคัดลอกแอปพลิเคชันเวอร์ชันที่ใหม่กว่าหรือเก่ากว่า แต่เมื่อประทับวันที่แก้ไขของไลบรารีที่แอปพลิเคชันใช้ไม่ถูกต้อง แต่ชื่อไฟล์เองก็มีหมายเลขเวอร์ชัน
Henno Vermeulen

จำเป็นต้องรวม/eหรือไม่? แล้วถ้าใช้/sแทนล่ะ? ฉันไม่ต้องการโฟลเดอร์ย่อยที่ว่างเปล่ามากมาย
Arete

48

วิธีแก้ปัญหาของเบลิซาริอุสเป็นสิ่งที่ดี

เพื่ออธิบายรายละเอียดเกี่ยวกับคำตอบสั้น ๆ นั้น:

  • /E ทำให้ Robocopy คัดลอกไดเรกทอรีย่อยซ้ำ ๆ รวมถึงไดเร็กทอรีว่าง
  • /XCไม่รวมไฟล์ที่มีอยู่ซึ่งมีการประทับเวลาเดียวกัน แต่มีขนาดไฟล์ต่างกัน ปกติ Robocopy จะเขียนทับสิ่งเหล่านั้น
  • /XNไม่รวมไฟล์ที่มีอยู่ใหม่กว่าสำเนาในไดเร็กทอรีต้นทาง ปกติ Robocopy จะเขียนทับสิ่งเหล่านั้น
  • /XOไม่รวมไฟล์ที่มีอยู่เก่ากว่าสำเนาในไดเร็กทอรีต้นทาง ปกติ Robocopy จะเขียนทับสิ่งเหล่านั้น

ด้วยการยกเว้นคลาสที่เปลี่ยนแปลงเก่ากว่าและใหม่กว่า Robocopy จะทำตามที่ผู้โพสต์ต้องการโดยไม่จำเป็นต้องโหลดสภาพแวดล้อมการเขียนสคริปต์


47

คุณสามารถลองสิ่งนี้:

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

-yเพียงแค่แจ้งก่อนที่จะเขียนทับและเราสามารถใส่ n สำหรับคำถามเหล่านั้นทั้งหมด ดังนั้นสิ่งนี้จะเป็นเพียงแค่คัดลอกไฟล์ที่ไม่มีอยู่ :)


2
เรียบง่ายสวยงาม
Holf

6
ทำไมมันตอบทุกคำถามเมื่อเราไปป์เพียงครั้งเดียว?
phuclv

เยี่ยมมากฉันเลือกตัวเลือกนี้ ก่อนที่จะคิดถึงการวางท่อฉันได้ค้นหาพารามิเตอร์ที่ฉันคิดว่าหายไปจากนั้นฉันก็เจอหน้านี้ ลองใช้วิธีนี้ฉันสังเกตเห็นว่าเมื่อวางท่อดูเหมือนว่าการคัดลอกจะเปิดใช้งานพารามิเตอร์ / Y ดังนั้นจึงต้องเพิ่ม / -Y
Andrew

2
@phuclv ดูเหมือนว่าcopy /-yจะถือว่าไม่มีโดยอัตโนมัติเมื่อ stdin หมดอินพุต คุณสามารถละเว้นรายการแรกอย่างโจ่งแจ้งnหรือ< nulใส่เข้าไปในนั้นสิ่งเดียวกันก็เกิดขึ้น
mwfearnley

6

นี่คือรูปแบบไฟล์แบตช์:

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

3

ฉันแค่ต้องการชี้แจงบางอย่างจากการทดสอบของฉันเอง

@Hydrargyrum เขียนว่า:

  • / XN ไม่รวมไฟล์ที่มีอยู่ใหม่กว่าสำเนาในไดเร็กทอรีต้นทาง ปกติ Robocopy จะเขียนทับสิ่งเหล่านั้น
  • / XO ไม่รวมไฟล์ที่มีอยู่เก่ากว่าสำเนาในไดเร็กทอรีต้นทาง ปกติ Robocopy จะเขียนทับสิ่งเหล่านั้น

นี่เป็นการย้อนกลับจริง XN ทำไฟล์ "eXclude Newer" แต่ไม่รวมไฟล์ที่ใหม่กว่าสำเนาในไดเร็กทอรีปลายทาง XO ทำ "eXclude Older" แต่จะไม่รวมไฟล์ที่เก่ากว่าสำเนาในไดเร็กทอรีปลายทาง

แน่นอนทำการทดสอบของคุณเองเช่นเคย


1
นี่เป็นคำตอบสำหรับคำถามเดิมหรือแสดงความคิดเห็นเกี่ยวกับคำตอบของผู้อื่น
ASGM

1
คำตอบของ Hydrargyrum ที่มีคะแนนโหวต +25 เมื่อเขียนคำตอบสำหรับคำถามเดิมหรือแสดงความคิดเห็นเกี่ยวกับคำตอบของผู้อื่น
เดือน

3

มีวิธีแปลก ๆ ในการทำ xcopy:

echo nnnnnnnnnnn | xcopy /-y source target

เพียงใส่ n ให้มากที่สุดเท่าที่คุณกำลังคัดลอกไฟล์และมันจะตอบ n สำหรับคำถามที่เขียนทับทั้งหมด


เกี่ยวกับcopyดูคำตอบนี้โดยเฉพาะความคิดเห็น @mwfearnley: copy /-yจะถือว่าโดยอัตโนมัติnเมื่อ stdin หมดดังนั้นคุณสามารถทำได้echo nเพียงครั้งเดียวและยังใช้งานได้
rsenna

3
robocopy src dst /MIR /XX

/ XX: eXclude ไฟล์ "eXtra" และ dirs (อยู่ในปลายทาง แต่ไม่ใช่ต้นทาง) วิธีนี้จะป้องกันการลบจากปลายทาง (นี่คือค่าเริ่มต้น)


1

สามารถดาวน์โหลด Robocopy ได้ที่นี่สำหรับระบบที่ยังไม่ได้ติดตั้ง (เช่น Windows Server 2003)

http://www.microsoft.com/download/th/details.aspx?displaylang=th&id=17657 (ไม่ต้องรีบูตเครื่องสำหรับการติดตั้ง)

อย่าลืมกำหนดเส้นทางของคุณไปยัง exe robocopy คุณทำได้โดยคลิกขวาที่ "คอมพิวเตอร์ของฉัน"> คุณสมบัติ> ขั้นสูง> "ตัวแปรสภาพแวดล้อม" จากนั้นค้นหาตัวแปรระบบเส้นทางและเพิ่มสิ่งนี้ต่อท้าย: "; C: \ Program Files \ Windows Resource Kits \ Tools" หรือที่ใดก็ตามที่คุณ ติดตั้ง ตรวจสอบให้แน่ใจว่าได้ปล่อยสตริงตัวแปรพา ธ ที่มีอยู่แล้วและเพียงต่อท้ายพา ธ เสริม

เมื่อกำหนดเส้นทางแล้วคุณสามารถรันคำสั่งที่ belisarius แนะนำได้ มันใช้งานได้ดี


1

มันจะไม่ให้ฉันแสดงความคิดเห็นโดยตรงกับข้อความที่ไม่ถูกต้อง - แต่ขอเตือนทุกคนว่าคำจำกัดความของตัวเลือก / XN และ / XO นั้นถูกย้อนกลับเมื่อเทียบกับสิ่งที่โพสต์ในข้อความก่อนหน้านี้

ตัวเลือกยกเว้นไฟล์ที่เก่ากว่า / ใหม่กว่าจะสอดคล้องกับข้อมูลที่แสดงในการบันทึกของ RoboCopy: RoboCopy จะวนซ้ำผ่าน SOURCE จากนั้นรายงานว่าแต่ละไฟล์ใน SOURCE "เก่า" หรือ "ใหม่กว่า" กว่าไฟล์ในปลายทางหรือไม่

ดังนั้น / XO จะยกเว้นไฟล์ OLDER SOURCE (ซึ่งใช้งานง่าย) ไม่ใช่ "เก่ากว่าแหล่งที่มา" ตามที่มีการอ้างสิทธิ์ที่นี่

หากคุณต้องการคัดลอกเฉพาะไฟล์ต้นทางใหม่หรือที่เปลี่ยนแปลง แต่หลีกเลี่ยงการแทนที่ไฟล์ปลายทางล่าสุด / XO เป็นตัวเลือกที่ถูกต้องในการใช้


0

วิธีง่ายๆคือการใช้ตัวเลือก / MIR เพื่อจำลองไดเรกทอรีทั้งสอง โดยทั่วไปจะคัดลอกเฉพาะไฟล์ใหม่ไปยังปลายทาง ใน com ถัดไปและแทนที่ต้นทางและปลายทางด้วยเส้นทางไปยังโฟลเดอร์ของคุณสคริปต์จะค้นหาไฟล์ที่มีนามสกุลใด ๆ

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\

ทำการทดสอบก่อนการใช้งาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.