2009-08-03 15 views
35

ich ein Neuling bin, so mit mir tragen ...Batch-Datei Kopieren von Dateien mit bestimmten Erweiterungen aus mehreren Verzeichnissen in einem Verzeichnis

Ich versuche, alle .doc Dateien zu kopieren, die ich über mehrere Unterverzeichnisse eines verstreut haben Hauptverzeichnis in ein anderes Verzeichnis mit einer Batch-Datei. Ich es geschafft haben, eine filelist.txt aller Dateien zu erhalten (es gibt Hunderte) aus diesen Verzeichnissen, die ich möchte mit kopieren:

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

Welche Skript würde ich die in einem Verzeichnis in xcopy verwenden? Kann ich einen Code verwenden, der diese Dateinamen tatsächlich von filelist.txt erfasst und sie kopiert?

Als Referenz, schaute ich auf die Frage unten, weil es so aussah, als würde es tun, was ich tun wollte, aber es hat nicht für mich funktioniert.

Using xcopy to copy files from several directories to one directory

Außerdem würde Ich mag dieses Konzept verstehen, also bitte den Code brechen für mich, mir zu sagen, was jedes Element der Fall ist, oder zumindest einen Link, die es erklären.

+1

Open in Windows Explorer machen, für * .doc suchen, wählen Sie alle (Strg + A) und kopiere sie/kopiere sie in das neue Verzeichnis ... Ich ging auch zuerst zu cmd line, aber die GUI Lösung ist viel schneller :) – Alex

+0

Ich denke du kannst einfach * .doc suchen und die Ergebnisse kopieren! – aliqandil

Antwort

54

In einer Batch-Datei Lösung

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

Der Code als solche funktioniert;

für jede Datei for im Verzeichnis c:\source und Unterverzeichnisse /R, die Muster übereinstimmen (\*.xml) den Dateinamen für jede Datei do Datei kopieren copy %%f zum Ziel x:\\destination\\

Gerade getestet es hier auf meinem Windows XP-Computer in Variable %%f, dann setzen und es hat wie ein Leckerbissen für mich funktioniert. Aber ich tippte es in die Eingabeaufforderung, so dass ich die einzelne %f Variable Name Version, wie in der verknüpften Frage oben beschrieben.

+1

Wie würden Sie das Problem ansprechen, wenn der exe-Name Leerzeichen enthält? – Euclid

+1

@Euclid über meinem Kopf Ich würde die letzte %% f in '%% f' ändern, um die Leerzeichen zu schützen –

+3

Vielen Dank. Wie würden wir dies tun, während wir die Ordner behalten, aus denen es stammt? Beispiel: Bewahren Sie die Dateien in ihren Ordnernamen und ihrer Baumstruktur auf. – codeshark

6

Diese Dinge sind, warum ich zu Powershell wechselte. Probieren Sie es aus, es macht Spaß:

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

Sie können einfach 'gci -rec -inc * .doc | cp -dest X: \ Destination, da 'Copy-Item' Pipelineinput akzeptiert. Sie können "Get-ChildItem" auch komplett loswerden und einfach "Copy-Item -Recurse -Include * .doc -Destination C: \ Destination" verwenden, da 'Copy-Item'' -Recurse' und '-Include' hat auch. – Joey

+0

behält dies die Unterordnerstruktur? scheint nicht –

+1

@Joey Erster Vorschlag funktioniert, zweite Frage "* Werte für die folgenden Parameter: *". Ich habe versucht, Recurse zu beenden, dann habe ich mir 'Get-Help Copy-Item -Detailed' angeschaut und dann beschlossen, dass ich einfach deinen ersten Vorschlag machen sollte. ;) – ruffin

1

Sie auch 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 

speichern als mycopy.vbs und auf der Kommandozeile

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

Brandon, kurz und süß verwenden können. Auch flexibel.

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 
) 

Hoffe das hilft.

Ich würde einige Prüfungen nach der Kopie hinzufügen (mit '||'), aber ich bin mir nicht sicher, wie "copy/v" reagiert, wenn ein Fehler auftritt.

Sie möchten, dies versuchen:

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

Als Kopie Linie. lassen Sie mich wissen, wenn Sie etwas daraus bekommen (in keiner Position, um eine Kopie Fehler atm ..)

33

einfach den Befehl XCOPY

mit rekursiven Option
xcopy c:\*.doc k:\mybackup /sy 

/s wird es "rekursiv" das Hauptverzeichnis

+4

Das machte meinen Tag. Danke vielmals! – degot

+4

Aber wenn eine Datei im Unterordner von 'c:' ist, dann kopiert sie auch den Unterordner und die '.doc' Datei .... anstelle der Datei selbst ohne den Unterordner – ron

+0

Made my day. Vielen Dank. – Govinda

Verwandte Themen