2009-08-03 17 views
35

Soy un novato, así que tengan paciencia conmigo ...por lotes archivos de copia de archivos con ciertas extensiones de varios directorios en un solo directorio

que estoy tratando de copiar todos los archivos .doc que he dispersos por varios subdirectorios de una directorio principal en otro directorio utilizando un archivo por lotes. He conseguido un filelist.txt de todos los archivos (hay cientos) fuera de estos directorios que desea copiar usando:

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

¿Qué guión iba a utilizar para los xcopy en un directorio? ¿Puedo usar algún código que realmente tome esos nombres de archivos del filelist.txt y los copie?

Como referencia, miré la pregunta a continuación porque parecía que estaba haciendo lo que quería hacer, pero no funcionó para mí.

Using xcopy to copy files from several directories to one directory

Además, me gustaría mucho entender este concepto, así que por favor romper el código para mí para decirme lo que hace cada elemento, o al menos incluir un enlace que explicarlo.

+1

Abra el directorio principal en el Explorador de Windows, buscar * .doc, seleccionar todo (Ctrl + A) y copiarlos/pegarlos en el nuevo directorio ... Yo también fui inicialmente a la línea de cmd para esto, pero la solución de GUI es mucho más rápida :) – Alex

+0

¡Creo que solo puedes buscar * .doc y copiar los resultados! – aliqandil

Respuesta

54

En una solución de archivo por lotes

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

El código funciona como tal;

para cada archivo for en el directorio c:\source y subdirectorios /R que coincidan con el patrón (\*.xml) puso el nombre de archivo en la variable %%f, a continuación, para cada archivo de copia de archivos docopy %%f a destino x:\\destination\\

acabo de probar aquí en el equipo Windows XP y funcionó como un regalo para mí. Pero lo escribí en el símbolo del sistema, así que utilicé la única versión de nombre de variable %f, como se describe en la pregunta vinculada más arriba.

+1

¿Cómo abordaría el problema si el nombre del exe tiene espacios en él? – Euclid

+1

@Euclid en la parte superior de mi cabeza, cambiaría el %% f final a '%% f' para proteger los espacios –

+3

Muchas gracias. ¿Cómo podríamos hacer esto mientras conservamos las carpetas de las que provienen? Ejemplo: mantenga los archivos en sus nombres de carpeta y estructura de árbol – codeshark

6

Cosas como estas son las razones por las que cambié a Powershell. Pruébalo, es divertido:

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

Puedes simplemente hacer 'gci -rec -inc * .doc | cp -dest X: \ Destination' ya que 'Copy-Item' acepta entrada de canalización. También es probable que pueda deshacerse de 'Get-ChildItem' por completo y simplemente haga' Copy-Item -Recurse -Include * .doc -Destination C: \ Destination' ya que 'Copy-Item' tiene' -Recurse' y '-Include' también. – Joey

+0

mantiene esto la estructura de la subcarpeta? Parece que no –

+1

@Joey La primera sugerencia funcionó, luego se le preguntó "* Proporcione valores para los siguientes parámetros: *". Intenté mover Recurse a end, luego comencé a buscar 'Get-Help Copy-Item -Detailed' y luego decidí que debería intentar su primera sugerencia. ;) – ruffin

1

también se puede utilizar 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 

guardar como mycopy.vbs y en la línea de comandos

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

Brandon, corto y dulce. También flexible.

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 
) 

Espero que esto ayude.

Agregaría algunas verificaciones después de la copia (usando '||') pero no estoy seguro de cómo "copy/v" reacciona cuando encuentra un error.

es posible que desee probar esto:

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

A medida que la línea de copia. hágamelo saber si obtiene algo de él (en ningún lugar para probar un error de copia atm.)

33

sólo tiene que utilizar el comando XCOPY con la opción recursiva

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

/s hará que sea "recursivo"

+4

Esto hizo mi día. ¡Muchas gracias! – degot

+4

Pero si un archivo es una subcarpeta de 'c:' entonces también copia la subcarpeta y el archivo '.doc' .... en lugar del archivo sin la subcarpeta – ron

+0

Hizo mi día también. Gracias. – Govinda

Cuestiones relacionadas