2009-08-03 11 views
35

Sono un principiante, in modo da portare con me ...batch con determinate estensioni dalla più directory in una directory

sto cercando di copiare tutti i file .doc che ho sparsi per diverse sottodirectory di una directory principale in un'altra directory utilizzando un file batch. Sono riusciti a ottenere un filelist.txt di tutti i file (ci sono centinaia) su queste directory che voglio copiare utilizzando:

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

quale script dovrei usare per xcopy quelli in una directory? Posso usare un codice che in realtà prende questi nomi di file da filelist.txt e li xcopies?

Per riferimento, ho esaminato la domanda di seguito perché sembrava che stesse facendo ciò che volevo fare, ma non ha funzionato per me.

Using xcopy to copy files from several directories to one directory

Inoltre, mi piacerebbe davvero capire questo concetto, quindi si prega di abbattere il codice per me me dire ciò che ogni elemento fa, o almeno includere un link che spiegarlo.

+1

Aprire la cartella principale in Esplora risorse, la ricerca di * .doc, selezionare tutto (Ctrl + A) e copiarli/incollarli nella nuova directory ... Anch'io inizialmente sono andato sulla linea cmd per questo, ma la soluzione della GUI è molto più veloce :) – Alex

+0

Penso che si possa semplicemente cercare * .doc e copiare i risultati! – aliqandil

risposta

54

In una soluzione di file batch

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

Il codice funziona in quanto tale;

per ogni file for nella directory c:\source e sottodirectory /R che corrispondono modello (\*.xml) mettere il nome del file nella variabile %%f, poi per ogni file do copia del file copy %%f a destinazione x:\\destination\\

appena provato qui sul mio computer con Windows XP e ha funzionato come un piacere per me. Ma l'ho digitato nel prompt dei comandi, quindi ho usato la singola versione del nome della variabile %f, come descritto nella domanda collegata sopra.

+1

Come affronteresti il ​​problema se il nome di exe contiene degli spazi? – Euclid

+1

@Euclide dalla cima della mia testa cambierei il %% f finale a '%% f' per proteggere gli spazi –

+3

Grazie mille. Come lo faremmo mantenendo le cartelle da cui proviene? Esempio: mantenere i file nei loro nomi di cartelle e struttura ad albero – codeshark

6

Cose come queste sono il motivo per cui sono passato a PowerShell. Provalo, è divertente:

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

In realtà puoi semplicemente fare 'gci -rec -inc * .doc | cp -dest X: \ Destination' poiché 'Copy-Item' accetta l'input della pipeline. Inoltre puoi probabilmente sbarazzarti di 'Get-ChildItem' completamente e basta fare 'Copia-Oggetto -Recurse -Include * .doc -Destinazione C: \ Destinazione' dato che' Copia-Oggetto' ha' -Recurse' e ​​'-Include' anche. – Joey

+0

mantiene la struttura della sottocartella? sembra non –

+1

@ Joey Primo suggerimento lavorato, secondo chiesto "* Fornire i valori per i seguenti parametri: *". Ho provato a spostare Recurse alla fine, poi ho iniziato a guardare "Copia-Oggetto-Get-Help", poi ho deciso che dovevo provare il tuo primo suggerimento. ;) – ruffin

1

è anche possibile utilizzare 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 

Salva con nome mycopy.vbs e sulla linea di comando

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

Brandon, breve e dolce. Inoltre flessibile.

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 
) 

Spero che questo aiuti.

Vorrei aggiungere alcuni controlli dopo la copia (utilizzando '||') ma non sono sicuro di come "copy/v" reagisce quando incontra un errore.

si consiglia di provare questo:

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

Come la linea copia. fammi sapere se ne ottieni qualcosa (non puoi testare un errore di copia atm ..)

33

basta usare il comando XCOPY con l'opzione ricorsiva

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

/s renderà "ricorsivo"

+4

Questo ha reso la mia giornata. Molte grazie! – degot

+4

Ma se un file in è una sottocartella di 'c:' allora copia anche la sottocartella e il file '.doc' .... invece del file stesso senza la sottocartella – ron

+0

Effettuata anche la mia giornata. Grazie. – Govinda