2011-12-31 73 views
7

Dưới đây là một số mã tôi đã :)Robocopy - Sao chép nội dung thư mục vào một thư mục đơn

@echo off 
set source="R:\Contracts\" 
set destination="R:\Contracts\Sites\" 
ROBOCOPY %source% %destination% *.srt *.pdf *.mp4 *.jpg /COPYALL /R:0 /S 
for /r %source in (*) do @copy "%destination" . 

R: \ Hợp đồng \ là đầy đủ của thư mục đó có các file trong đó.

Tôi muốn sao chép tất cả sang R: \ Hợp đồng \ Sites \ và làm phẳng cấu trúc thư mục.

Mọi thứ đều sao chép tốt mà còn cấu trúc thư mục.

Cảm ơn bạn

+0

bản sao có thể có của [Cách sao chép tệp từ cây thư mục thả tất cả các thư mục bằng Robocopy?] (Http://stackoverflow.com/questions/1502170/how-to-copy-files-from-folder-tree-dropping -all-the-folders-with-robocopy) –

Trả lời

9

Không có lệnh nào sẽ làm phẳng cấu trúc phân cấp cho bạn; bạn sẽ phải sử dụng nhiều lệnh. Nó có thể được thực hiện đơn giản bằng cách sử dụng FOR/R để đi bộ phân cấp, cùng với lệnh copy/move của bạn (di chuyển, sao chép, xcopy, robocopy). Vì đích của bạn nằm trong hệ thống phân cấp nguồn, bạn cần một IF để ngăn đích đến là nguồn.

Trước khi tiếp tục, bạn nên dừng lại và suy nghĩ về những gì sẽ xảy ra nếu cùng một tên tệp xuất hiện trong nhiều thư mục nguồn. Bạn chỉ có thể có một phiên bản trong thư mục đích của mình. Bạn có thể đảm bảo không có tên trùng lặp tồn tại? Nếu không, tệp nào sẽ được lưu giữ? Làm thế nào bạn có thể cấu trúc lệnh để giữ tập tin bạn muốn? Biến chứng này có lẽ là lý do tại sao không có lệnh nào được viết để đơn giản làm phẳng một hệ thống phân cấp.

Đây là lệnh ROBOCOPY của bạn được tích hợp với giải pháp FOR/R.

@echo off 
set source="R:\Contracts" 
set destination="R:\Contracts\Sites" 

::Not sure if this is needed 
::It guarantees you have a canonical path (standard form) 
for %%F in (%destination%) do set destination="%%~fF" 

for /r %source% %%F in (.) do if "%%~fF" neq %destination% ROBOCOPY "%%F" %destination% *.srt *.pdf *.mp4 *.jpg /COPYALL /R:0 
+0

Xin chào dbenham, trước hết, Cảm ơn bạn RẤT NHIỀU. Tôi đã thử mã trên tuy nhiên nó dường như không hoạt động. Tôi đã thực hiện một tập tin thực thi và kiểm tra nó. Tôi đã được thông qua mã và không thể nhìn thấy bất kỳ sai lầm trực tiếp. Làm ơn cho tôi biết. Cảm ơn bạn – Arthor

+0

Xin chào, tôi đã xóa dòng này "cho %% F trong (% destination%) làm đặt đích ="% ~ fF "" và có vẻ như nó hoạt động. Tuy nhiên tôi không chắc chắn nếu nó là cần thiết. Nếu cảm ơn Cảm ơn bạn DBENHAM – Arthor

+0

Rất tiếc - Tôi đã thiếu một% gần cuối dòng đó. Bây giờ nó đã được sửa. Mục đích của nó là đảm bảo đường dẫn được biểu diễn ở dạng chuẩn, đủ tiêu chuẩn để câu lệnh IF tiếp theo hoạt động đúng. – dbenham

0

Gần đây tôi đã phải giải quyết vấn đề này, và nhiều tác phẩm mà tôi muốn chuyển sang từ hệ thống phân cấp vào một thư mục duy nhất có cùng tên với nhau, và tôi muốn vẫn san bằng hệ thống cấp bậc mà không cần họ bị ghi đè. Những gì tôi đã làm là viết một kịch bản mà di chuyển các tập tin, nhưng đổi tên nó với đường dẫn hệ thống cấp bậc cũ trong tên ví dụ: nguồn tập tin:

C: \ file \ somefiles \ file.txt

C: \ file \ otherfiles \ file.txt

đích là C: \ newdir \ tập tin được tạo ra như

C: \ newdir \ somefiles-file.txt

C: \ newdir \ otherfiles-file.txt

đây là mã, hàng loạt tập tin 1 đi qua các tập tin, tập tin thực thi 2 đổi tên và di chuyển chúng (cũng có thể sao chép thay vào đó, nếu bạn muốn giữ nguồn:

@echo off 
for /r %%f in (*.*pr) do @renameandmovefilespart2.bat "%%f" "%%~ff" "%%~xf" 

renameandmovefilespart2.bat

@echo off 
Setlocal EnableDelayedExpansion 
rem set the whole file path 
set origWhole=%1 
set origPathOnly=%2 
set extension=%3 
rem here you can set where the directory to hold the flattened hierarchy is 
set destDir=c:\destinationDir\ 
rem set the directory to do a string replace 
rem make this the starting directory, that you dont want in the newly renamed files 
set startingDir=C:\starting\directory\ 
set nothing= 
set slash=\ 
rem here you can set what the character to represent the directory indicator \ in the new files 
set reaplcementDirectoryCharacter=-- 
set quote=" 
rem cut out the starting part of the directory 
call set newname=%%origWhole:!startingDir!=!nothing!%% 
rem replace slashes with new character 
call set newname=%%newname:!slash!=!reaplcementDirectoryCharacter!%% 
rem remove quotes 
call set newname=%%newname:!quote!=!nothing!%% 
rem @echo shortened: %newname% 
rem @echo source path: %origPathOnly% newPath: %startingDir% 
rem @echo extension: %extension% 
rem rename the files 
ren %origWhole% %newname% 
rem prepare to move the file, clean up the source path 
call set origPathOnly=%%origPathOnly:!quote!=!nothing!%% 
move "%origPathOnly%%newname%" "%destDir%" 
7

Bạn có thể làm điều đó với một lớp lót PowerShell. Trong ví dụ này, tôi lọc ra tất cả các tệp có phần mở rộng .txt từ tất cả các thư mục con. Và sau đó gửi chúng đến Cmdlet Move-Item.

Kết hợp Cmdlets get-Childitem (viết tắt là GCI), -recurse, maby -filter và sau đó đưa kết quả vào lệnh Move-Item Cmdlet. Sử dụng -WhatIf đầu tiên để kiểm tra rằng đầu ra là những gì bạn mong đợi.

Di chuyển đến thư mục hiện hành

get-Childitem -recurse -filter *.txt | Move-Item -WhatIf 

Di chuyển đến một thư mục khác

get-Childitem -recurse -filter *.txt | Move-Item -Destination c:\temp -WhatIf 
+0

rực rỡ. đơn giản, dễ hiểu. – sonjz

0

Có một tiện ích PCMag cũ gọi Sweep.exe có thể vận hành lệnh tương tự trong hiện tại và thư mục con. Tôi sẽ không đặt đích như thư mục con của thư mục nguồn. Đặt đích đến nơi khác.

http://www.rarewares.org/files/case/Sweep.zip

cd c:\contracts sweep copy *.* c:\sites

này sẽ sao chép tất cả mọi thứ từ c: hợp đồng \ và bên dưới để c: \ trang web

tôi sử dụng một lệnh tương tự để làm phẳng các hệ thống cấp bậc của một thư mục.

Chăm sóc bản sao và cách bạn muốn xử lý chúng. Bạn có muốn ghi đè hoặc xử lý một cách khác không.

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