2009-08-03 31 views
35

Tôi là một newbie, vì vậy chịu với tôi ...hàng loạt tập tin Sao chép tập tin với phần mở rộng nhất định từ nhiều thư mục vào một thư mục

Tôi cố gắng để sao chép tất cả các file .doc mà tôi đã rải rác khắp nhiều thư mục con của một thư mục chính vào một thư mục khác bằng cách sử dụng một tập tin thực thi. Tôi đã cố gắng để có được một filelist.txt của tất cả các file (có hàng trăm) ra khỏi những thư mục mà tôi muốn sao chép sử dụng:

"C:\Main directory\sub directory" dir /b /s *.doc > "C:\Main directory\sub directory\filelist.txt"

kịch bản Những gì tôi sẽ sử dụng để xcopy những thành một thư mục? Tôi có thể sử dụng một số mã thực sự lấy các tên tệp đó từ filelist.txt và xcopies chúng không?

Để tham khảo, tôi đã xem xét câu hỏi bên dưới vì có vẻ như nó đang làm những gì tôi muốn, nhưng nó không hiệu quả đối với tôi.

Using xcopy to copy files from several directories to one directory

Ngoài ra, tôi thực sự muốn hiểu khái niệm này, vì vậy hãy phá vỡ các mã cho tôi để cho tôi biết những gì từng hạng mục có, hoặc ít nhất là bao gồm một liên kết mà sẽ giải thích nó.

+1

Mở thư mục chính trong Windows Explorer, tìm kiếm * .doc, chọn tất cả (Ctrl + A) và sao chép/dán chúng vào thư mục mới ... Ban đầu tôi cũng đã đi đến dòng cmd, nhưng giải pháp GUI nhanh hơn nhiều :) – Alex

+0

Tôi nghĩ bạn chỉ có thể tìm kiếm * .doc và sao chép kết quả! – aliqandil

Trả lời

54

Trong một giải pháp tập tin batch

for /R c:\source %%f in (*.xml) do copy %%f x:\destination\ 

Mã này hoạt động như vậy;

cho mỗi tập tin for trong thư mục c:\source và thư mục con /R phù hợp với mô hình (\*.xml) đặt tên tập tin trong biến %%f, sau đó cho mỗi tập tin do sao chép tập tin copy %%f đến đích x:\\destination\\

Chỉ cần kiểm tra nó ở đây trên máy tính Windows XP của tôi và nó hoạt động như một điều trị cho tôi. Nhưng tôi đã gõ nó vào dấu nhắc lệnh vì vậy tôi đã sử dụng phiên bản tên biến duy nhất %f, như được mô tả trong câu hỏi được liên kết ở trên.

+1

Làm thế nào bạn sẽ giải quyết vấn đề nếu tên exe có không gian trong đó? – Euclid

+1

@Euclid khỏi đỉnh đầu của tôi, tôi sẽ thay đổi %% f thành '%% f' cuối cùng để bảo vệ không gian –

+3

Cảm ơn bạn rất nhiều. Làm thế nào chúng ta sẽ làm điều này trong khi giữ lại các thư mục mà nó đến từ đâu? Ví dụ: giữ các tệp trong tên thư mục và cấu trúc cây của chúng – codeshark

6

Những thứ như thế này là lý do tôi chuyển sang Powershell. Hãy thử nó ra, nó là thú vị:

Get-ChildItem -Recurse -Include *.doc | % { 
    Copy-Item $_.FullName -destination x:\destination 
} 
+6

Bạn có thể thực sự chỉ cần thực hiện 'gci -rec -inc * .doc | cp -dest X: \ Destination' vì 'Copy-Item' chấp nhận đầu vào đường ống. Ngoài ra bạn có thể có thể loại bỏ 'Get-ChildItem' hoàn toàn và chỉ cần thực hiện' Copy-Item -Recurse -Include * .doc -Destination C: \ Destination' vì 'Copy-Item' có' -Recurse' và '-Include' cũng. – Joey

+0

điều này có giữ lại cấu trúc thư mục con không? có vẻ không phải là –

+1

@Joey Đề xuất đầu tiên đã hoạt động, thứ hai hỏi "* Giá trị cung cấp cho các thông số sau: *". Cố gắng di chuyển Recurse để kết thúc, sau đó bắt đầu tìm kiếm 'Get-Help Copy-Item -Detailed', sau đó quyết định tôi nên thử đề nghị đầu tiên của bạn. ;) – ruffin

1

bạn cũng có thể sử dụng VBScript

Set objFS = CreateObject("Scripting.FileSystemObject") 
strFolder = "c:\test" 
strDestination = "c:\tmp\" 
Set objFolder = objFS.GetFolder(strFolder) 

Go(objFolder) 

Sub Go(objDIR) 
    If objDIR <> "\System Volume Information" Then 
    For Each eFolder in objDIR.SubFolders  
     Go eFolder 
    Next 
    For Each strFile In objDIR.Files 
     strFileName = strFile.Name 
     strExtension = objFS.GetExtensionName(strFile) 
     If strExtension = "doc" Then 
      objFS.CopyFile strFile , strDestination & strFileName 
     End If 
    Next  
    End If 
End Sub 

tiết kiệm như mycopy.vbs và trên dòng lệnh

c:\test> cscript /nologo mycopy.vbs 
4

Brandon, ngắn và ngọt ngào. Cũng linh hoạt.

set dSource=C:\Main directory\sub directory 
set dTarget=D:\Documents 
set fType=*.doc 
for /f "delims=" %%f in ('dir /a-d /b /s "%dSource%\%fType%"') do (
    copy /V "%%f" "%dTarget%\" 2>nul 
) 

Hy vọng điều này sẽ hữu ích.

Tôi sẽ thêm một số kiểm tra sau khi sao chép (sử dụng '||') nhưng tôi không chắc chắn cách "copy/v" phản ứng khi gặp lỗi.

bạn có thể muốn thử điều này:

copy /V "%%f" "%dTarget%\" 2>nul|| echo En error occured copying "%%F".&& exit /b 1 

Như dòng bản sao. cho tôi biết nếu bạn nhận được một cái gì đó ra khỏi nó (không có vị trí để kiểm tra một bản sao thất bại atm ..)

33

Chỉ cần sử dụng lệnh xcopy với tùy chọn đệ quy

xcopy c:\*.doc k:\mybackup /sy 

/s sẽ làm cho nó "đệ quy"

+4

Điều này làm cho ngày của tôi. Cảm ơn rất nhiều! – degot

+4

Nhưng nếu một tệp trong thư mục con của 'c:' thì nó cũng sao chép thư mục con và tệp '.doc' .... thay vì tệp mà không có thư mục con – ron

+0

Làm cho ngày của tôi cũng vậy. Cảm ơn. – Govinda

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