Copiar todos los archivos que contengan un nombre especifico para la carpeta del nombre especificado.

Tengo una carpeta que contiene varios archivos de nombre por ejemplo Alabama1.pdf, Alabama2.pdf, Alabama3.pdf, Ohio1.pdf, Ohio2.pdf, Florida1.pdf, Florida3.pdf y tengo carpetas con cada nombre Alabama, Ohio, Florida y necesito copiar todos los archivos que contengan en el nombre Alabama para la carpeta Alabama, todos los que contengan Ohio a la carpeta Ohio y asi para todos los ficheros de la carpeta.

¿Alguna idea?

Aleida

Respuesta
1

Me faltan algunos datos:

1. ¿El formato de los archivos a copiar es así de "rígido": aaaaaaN.pdf, donde aaaaaa es un texto y N un único número?

2. La carpeta de origen, en la que están los archivos que se quieren copiar, ¿es distinta de la carpeta destino, en la que están las subcarpetas donde deben copiarse los archivos?

Suponiendo que la respuesta a estas dos preguntas es afirmativa, he preparado esto que podría servirte:

@echo off
Setlocal EnableDelayedExpansion
set corigen=d:\carpeta prueba
set cdestino=d:\temp\carpeta prueba
for /f "tokens=* delims=" %%a in ('dir /b "%corigen%\*.pdf"') do (
   set nombre=%%~na
   set nombre=!nombre:~0,-1!
   if exist "%cdestino%\!nombre!" copy "%corigen%\%%a" "%cdestino%\!nombre!"
   )
goto :eof

Tendrías que rellenar el CORIGEN con la ubicación de la carpeta en la que están los archivos que quieres copiar y CDESTINO con la ubicación de la carpeta de la que cuelgan las carpetas de destino. Pueden ser iguales y también puede ser que la carpeta sea solo un nombre de unidad si están en el directorio raíz (por ejemplo "set cdestino=d:"). Si quieres puedes probarlo aunque para las pruebas te sugiero que antes del COPY pongas un ECHO para poder ver la sintaxis del comando antes de ejecutarlo. Si se ajusta a lo que esperas borras el ECHO y dejas que se ejecute el COPY.

Hola ggg! Muy buenos dias..

Muchas gracias.. Respuesta a tus preguntas, vi que no me explique bien en mi pregunta,

1. ¿El formato de los archivos a copiar es así de "rígido": aaaaaaN.pdf, donde aaaaaa es un texto y N un único número?...

No es rigido el texto " "aaaaa" forma parte del nombre del archivo origen y puede estar incluido en mas de un archivo de origen y cualquier posicion del nombre del archivo y N puede o no estar presente en el nombre del archivo.

Ejemplo:

Carpeta Origen puede tener archivos aaaaa1, aaaaa2, aaaaa5, bbbbb, bbbbb3 ... etc etc 

La Carpeta Destino tiene subcarpetas ya creadas con los nombres: 

aaaaa

bbbbb

Y necesito copiar todos los archivos que incluyan en su nombre el texto "aaaaa" a la carpeta  de nombre aaaaa, todos los archivos que tengan en el nombre el texto "bbbbb" para la carpeta bbbbb, o sea cada nombre de las subcarpetas destino es la cadena de texto a buscar en el nombre de los ficheros de la Carpeta Origen y son los archivos que tengo que copiar para esa carpeta.. Logro explicarme?

2. La carpeta de origen, en la que están los archivos que se quieren copiar, ¿es distinta de la carpeta destino, en la que están las subcarpetas donde deben copiarse los archivos?

si, Correcto

Muchas gracias por su tiempo..

Aleida

Prueba con esto:

@echo off
Setlocal EnableDelayedExpansion
set corigen=d:\carpeta prueba
set cdestino=d:\temp\carpeta prueba
for /f "tokens=* delims=" %%a in ('dir /b /ad "%cdestino%"') do (
   for /f "tokens=* delims=" %%x in ('dir /b "%corigen%"^|find "%%a"') do copy "%corigen%\%%x" "%cdestino%\%%a"
   )
goto :eof

Perdón, ahora no es necesario el segundo comando. Sería así:

@echo off
set corigen=d:\carpeta prueba
set cdestino=d:\temp\carpeta prueba
for /f "tokens=* delims=" %%a in ('dir /b /ad "%cdestino%"') do (
   for /f "tokens=* delims=" %%x in ('dir /b "%corigen%"^|find "%%a"') do copy "%corigen%\%%x" "%cdestino%\%%a"
   )
goto :eof

Funciono perfecto! Genial... el único detalle que en la Carpeta Origen puede tener subcarpetas que incluyen el texto "aaaaa" y debe copiarse la subcarpeta también con todos sus ficheros para la carpeta correspondiente Destino.

Muchas gracias.. Aleida

A ver si esto lo resuelve:

@echo off
set corigen=d:\carpeta prueba
set cdestino=d:\temp\carpeta prueba
for /f "tokens=* delims=" %%a in ('dir /b /ad "%cdestino%"') do (
   for /f "tokens=* delims=" %%x in ('dir /b "%corigen%"^|find "%%a"') do (
      if exist "%corigen%\%%x\*.*" (xcopy /s /i "%corigen%\%%x\*.*" "%cdestino%\%%a\%%x"
         ) else copy "%corigen%\%%x" "%cdestino%\%%a"
      )
   )

Este perfecto, ya copia la subcarpeta con los ficheros que contiene, pero me los copia doble,. Copia los ficheros dentro de la subcarpeta y fuera.

Pues no lo entiendo. A mí no me ocurre eso.
Ponme por aquí el bat que usas (corrigiendo, si quieres, los nombres de las carpetas por si fuera "información sensible") para ver si hay algo que lo explique.

¿Has abandonado este asunto? Me gustaría aclarar el punto pendiente.

Hola Buenos días ggg!

Disculpe no haberle podido responder de inmediato, he estado tan complicada en el trabajo que lo que me ha copiado doble lo estoy borrando a mano, espero en un rato poderle darle todos los detalles.

Un saludo y disculpe nuevamente.

Aleida

No te preocupes. No quería presionarte, era solo que si me olvido de los temas luego no recuerdo en que punto me quedé. Cosas de la edad.

En el carpeta origen tengo los siguientes ficheros y subcarpetas,

AAAAA.dbf

AAAAA_3602.pdf

AAAAA_trays.pdf

AAAAA_pallets.pdf

Una subcarpeta “AAAAA” y dentro de esta carpeta tengo ficheros con nombres:

                                  AAAAA.cpt

                                  AAAAA.txt

                                  AAAAA.csm  

Cuando se realiza la copia a la carpeta destino AAAAA

Copia bien la estructura pero los ficheros que están dentro de la subcarpeta AAAAA destino los copia también fuera quedando como:

AAAAA.dbf

AAAAA_3602.pdf

AAAAA_trays.pdf

AAAAA_pallets.pdf

Subcarpeta AAAAA

AAAAA.cpt

AAAAA.txt

AAAAA.csm

Entonces cuando voy a la subcarpeta AAAAA aparecen también estos archivos

AAAAA.cpt

AAAAA.txt

AAAAA.csm

 Por eso le decía que tengo estos repetidos.

El script fue el mismo que ud me envio solo cambiando el origen y destino aquí se lo anexo.

@echo off

set corigen=Y:\Stage

set cdestino=Y:\USG

for /f "tokens=* delims=" %%a in ('dir /b /ad "%cdestino%"') do (

   for /f "tokens=* delims=" %%x in ('dir /b "%corigen%"^|find "%%a"') do (

      if exist "%corigen%\%%x\*.*" (xcopy /s /i "%corigen%\%%x\*.*" "%cdestino%\%%a\%%x"

         ) else copy "%corigen%\%%x" "%cdestino%\%%a"

      )

   )

goto :eof

Pues sigue siendo inexplicable. He reproducido, razonablemente, tu entorno de pruebas como puedes ver en los pantallazos adjuntos, he copiado y pegado el bat tal como me lo has pasado (solo he cambiado los valores de las carpetas origen y destino) y no me ocurre lo que comentas, como puedes ver también en los pantallazos:

En este primer pantallazo te muestro el contenido de la carpeta origen (d:\carpeta prueba) y su única subcarpeta (d:\carpeta prueba\AAAAA) que siguen los nombres que me has indicado y el de la carpeta destino que no tiene nada.

En este segundo pantallazo te muestro el BAT (aleida1.bat), los mensajes de copia que provocan la ejecución del BAT y el nuevo contenido de la carpeta destino y de su única subcarpeta (creada ahora).

En este tercero termino de mostrar el contenido de la carpeta destino.

Incluyo comandos TIME para que puedas asegurarte de que ha sido todo consecutivo.

Solo se me ocurre que la forma de ejecutar el BAT no sea como la que utilizo yo, que es desde una ventana CMD/Símbolo del sistema. Si no fuera así, prueba a hacerlo así, antes de que sigamos investigando las causas. Te sugiero que pruebes en un entorno "reducido" para que no tengas que corregir demasiadas cosas.

Y aprovecho para comentarte que si quieres usar ventanitas independientes, como las que uso yo para incluir el código, la herramienta "<>" (o "snippet") te permite hacerlo.

¡Gracias! Ya funcionaba todo bien! PERFECT... Discúlpeme..

El problema era que desde que se copiaron la primera vez sin estructura de carpeta/subcarpeta los ficheros quedaron esos ficheros en las carpetas y después, ya cuando se copiaron bien, yo seguía viendo los ficheros afuera y adentro. Ahora borre todo el contenido antes de ejecutar el .bat

Por lo que esto me fuera muy necesiario hacerlo .. como hacer para que antes del copy, borrar todo lo que exista en la carpeta,¿así garantizo que no se quede ninguna información anterior?

Había pensado en algún momento que esa podía ser la causa, pero creía que las pruebas anteriores no habrían copiado los archivos de las subcarpetas y por eso no lo comenté como posibilidad.

Para el borrado que pides prueba esto:

@echo off
set corigen=d:\carpeta prueba
set cdestino=d:\temp\carpeta prueba
for /f "tokens=* delims=" %%a in ('dir /b /ad "%cdestino%"') do (
   for /f "tokens=* delims=" %%x in ('dir /b "%corigen%"^|find "%%a"') do (
      if exist "%corigen%\%%x\*.*" (rd /s /q "%cdestino%\%%a\%%x"
         xcopy /s /i "%corigen%\%%x\*.*" "%cdestino%\%%a\%%x"
         ) else copy /y "%corigen%\%%x" "%cdestino%\%%a"
      )
   )

He quitado el "goto :eof" final porque creo que es innecesario

¡Gracias ggg! Muchas gracias por su tiempo y dedicación! Funciono todo bien..

¿Otra preguntica cuando me decía de usar ventanitas independientes( la herramienta "<>" ) es que el código lo escribo dentro de < ..>? ¿Y sale en las ventanitas?

No. Me refiero al icono "<>" de la barra de herramientas de la página:

(El tercero por la derecha). Al pulsar en él se te abre una ventanita en la que puedes copiar lo que quieras.

Por cierto, si ya está resuelta tu consulta ciérrala.

Espero que haya quedado claro. Pero insisto en que cierres la consulta, y "califiques" la respuesta.

¡Gracias! Muy agradecida con su tiempo y dedicación! y todo perfecto...

Aleida

Hola GGG

Recuerda este tema? ahora tengo problemas que no se me copia y me da el siguiente mensaje,

Puede darme alguna idea..? No se que me quiere decir con "UNC paths are not supported"

Este enlace (espero que entiendas inglés, si no fuera así dímelo e intentaré traducírtelo, pero ya se sabe que "traduttore traditore":

https://stackoverflow.com/questions/9013941/how-to-run-batch-file-from-network-share-without-unc-path-are-not-supported-me 

No puedo recomendarte ninguna de las soluciones que proponen aunque yo empezaría por la que habla de deshabilitar el control de UNC, si tienes posibilidades de cambiar el registro de la máquina y tienes alguna experiencia con REGEDIT. Está marcada con un 24 (no sé si eso puede cambiar), su autor es Vinzz y dice:

There's a registry setting to avoid this security check (use it at your own risks, though):

Under the registry path

   HKEY_CURRENT_USER
     \Software
       \Microsoft
         \Command Processor

add the value DisableUNCCheck REG_DWORD and set the value to 0 x 1 (Hex).

Note: On Windows 10 version 1803, the setting seems to be located under HKLM: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor

Hola ggg, muy buenas tardes,

Ahora recorde que mi computer fue actualizada con windows 10, 

Llegue hasta la parte de tener que...... add the value DisableUNCCheck REG_DWORD and set the value to 0 x 1 (Hex). Como adiciono DisableUNCCheck?

Una vez situado en la clave indicada (parece que debería ser HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor según se dice en la nota) eliges Edición/Nuevo/Valor de DWORD(32 bits), la das el nombre DisableUNCCheck. Una vez creada pinchas dos veces en el nombre del valor y le asignas el valor 1. Ya nos contarás si da resultado.

Voy a probar y le comento si funciono..,

Una preguntica... ¿Esto sucedió por la instalación del windows 10 en la computer?

¿Esa modificación no debe modificarme otro trabajo?  es asi?

Considero muy probable que el cambio de versión de Windows pueda haber sido la causa de este problema. No deja de ser una supuesta mejora en cuanto a seguridad. Aunque uno pueda esperar razonablemente que no dejen de funcionar, sin avisar, cosas que antes funcionaban creo que hay suficientes pruebas que demuestran que Microsoft no es muy respetuoso en ese sentido. Incluso algunas veces una simple actualización de las recomendadas por Microsoft hace que te dejen de funcionar algunas cosas. Yo mismo he sufrido recientemente un problema que podría considerarse "de este estilo". Desde tiempo inmemorial usaba y uso el cliente de correo de Microsoft Outlook Express en mi equipo con Windows XP. De un día para otro dejé de poder descargarme el correo de hotmail (si tienes curiosidad puedes ver mis intentos de que me lo resolvieran en https://answers.microsoft.com/es-es/outlook_com/forum/osettings-oemailset/problemas-recientes-para-recibir-correo-de-una/cb66cb88-9c91-437d-b5de-f1fdc725fa3b?tm=1574411165466
)

Buenos días..

Nunca me había sucedido algo así.. ahora probé ejecutar el script de copy desde el propio server que es donde están los ficheros, cambiándole el path del directorio origen y raíz y También me da el mismo error y el server si no se ha tocado. Que situación!.. Algo que me funcionaba perfecto y me ahorraba una cantidad de tiempo increíble!

Esto es bastante más inesperado. A no ser que haga mucho tiempo que no hacías esta prueba directamente en el servidor/server y que en realidad ya se hubiera cambiado hace tiempo la versión que da estos problemas con el "UNC path" pero que no la hubieras detectado hasta ahora. Creo que debemos centrarnos en el primer problema antes de pasar a otros relacionados. En este contexto, ¿has probado la modificación del REGEDIT?

En todo caso ponme por aquí el bat que ejecutas en Windows 10 a ver si se me ocurre alguna alternativa.

Hola,

Es un trabajo muy largo que se corre cada 3 meses, la ultima vez fue noviembre y corrió perfecto, después de eso fue la actualización de la computer a windows 10.

Aquí le adjunto el batch que estoy usando.

Y: \  Es el network drive, ya probé poniéndole el path completo, no haciendo referencia al network drive y tampoco funciono..

@echo off
set corigen=Y:\Stage
set cdestino=Y:\42284 TEST
for /f "tokens=* delims=" %%a in ('dir /b /ad "%cdestino%"') do (
   for /f "tokens=* delims=" %%x in ('dir /b "%corigen%"^|find "%%a"') do (
      if exist "%corigen%\%%x\*.*" (xcopy /s /i "%corigen%\%%x\*.*" "%cdestino%\%%a\%%x"
         ) else copy "%corigen%\%%x" "%cdestino%\%%a"
      )
   )
goto :eof

No me has contestado a mi pregunta sobre el cambio propuesto para el REGEDIT.

Además de contestarme a eso dime que te saca el comando NET USE

No le respondi por que aun no he hecho esta parte que me comenta.. tengo temor que me vaya a cambiar algo de otro trabajo, estaba viendo y revisando los trabajos que tengo..

Una vez situado en la clave indicada (parece que debería ser HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor según se dice en la nota) eliges Edición/Nuevo/Valor de DWORD(32 bits), la das el nombre DisableUNCCheck. Una vez creada pinchas dos veces en el nombre del valor y le asignas el valor 1. Ya nos contarás si da resultado.

No debería afectar porque solo estás forzando a que no compruebe el uso de la sintaxis UNC (Universal Naming Convention). En todo caso, si quieres, creas el "valor", pruebas, y luego borras el "valor" (si no estaba creado).

Ok, así me sera más Seguro, Gracias

Ya me contarás.

Hola gg, Muy buenas tardes..

Recuerda este tema, ahora tuve tiempo para dedicarle y el error estaba en que el nombre de la carpeta destino incluía el signo de "&" en cuanto le cambie el nombre funciono perfecto.

Muchas gracias por todo su tiempo!

Aleida

Realmente ya no recordaba casi nada de este asunto. De todas formas me alegro de que lo hayas aclarado y resuelto.

1 respuesta más de otro experto

Respuesta

usa filecopy de vb.net

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas