Modificar código que copia archivos por extencio a usb

Tengo este código

for /d %%i in (c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) do (
if exist %%i:\biblioteca\historia\ for /r "c:\" %%a in (*.doc,*.docx,*.rtf) do (copy /y "%%a" "%%i:\biblioteca\historia\%%~nxa")
)
Pause

quiero quitarle esto "c:\" para que busque en todas las particiones del disco duro del pc o todos los discos del equipo y ademas recree la misma estructura donde se encuentran los archivos copiados. Es decir si un archivo se encuentra en D:\música\notas\punk.doc en la usb se cree la misma estrucura dentro de la carpeta \biblioteca\historia\

1 respuesta

Respuesta
1

No tengo muy claro lo que pretendes:

Archivos a copiar:

Cualquiera que tenga alguna de las extensiones DOC, DOCX, RTF en cualquier disco duro (o partición) sin saber previamente cuáles son las unidades de disco duro/partición

Unidad de destino y carpeta de destino:

Cualquier unidad USB que contenga una carpeta de nombre biblioteca\historia

Para cada uno de los archivos a copiar encontrados debe reproducirse en la carpeta biblioteca\historia de la unidad USB de destino la estructura que contenía al archivo

Si estas son las "especificaciones" creo que tendremos algún problema de entrar en bucle porque volveremos a encontrar los "archivos a copiar" en la "unidad de destino" (o unidades de destino).

De modo que habría que definir los límites de aplicación del "algoritmo".

Si limitamos las unidades de origen (digamos c, d, e y f) y las de destino (g, h, i y j por ejemplo) podemos intentar seguir adelante sin temor a entrar en bucle. Pero creo que hay que saber distinguir unas de otras (y no tienen por qué ser consecutivas, pero sí disjuntas).

Dime como te parece que debería abordarse el asunto (y también puedes hacer algún intento tú mismo, ¿no?)

cuando no me funciona lo que hago pues pregunto y no subo los errores que hago.

antes usaba un código para detectar las particiones del disco duro lo estoy buscando en internet pero no lo encuentro creo que es la clave para poder excluir las letras de las partituras del disco duro de las posibles letras de las unidades extraíbles

gracias

recuerdo que se usa Diskpart y List Volume para ver las particiones del disco duroy así ver las letras para luego excluirlas

No conocía el "comando" diskpart. Pero le estoy echando un vistazo y creo que puede servir como indicas, aunque puede ser algo laborioso obtener la lista total de unidades lógicas (particiones de disco duro).

Gracias por la información. Te tendré al tanto de mis avances.

Por cierto, me ha parecido detectar cierto malestar por mi comentario. Si es así, disculpa. Estás en tu derecho a utilizar estos foros según tu propio criterio.

En todo caso y dando por hecho que se detectan con diskpart las unidades de origen, ¿es correcto el resto de mi planteamiento ("Archivos a copiar", "Unidad de destino y carpeta de destino")?

Prueba con esto:

@echo off
echo list volume > dskpart.txt
echo exit >> dskpart.txt
for /f "tokens=3" %%i in ('diskpart /s dskpart.txt ^| find "Extra"') do (
if exist %%i:\biblioteca\historia\ for /f "tokens=3" %%a in ('diskpart /s dskpart.txt ^| find "Parti"') do (
for /f "tokens=1,* delims=\" %%k in ('dir /b /s %%a:\*.doc') do (echo F | xcopy "%%k\%%l" "%%i:\biblioteca\historia\%%l" > nul)
for /f "tokens=1,* delims=\" %%k in ('dir /b /s %%a:\*.docx') do (echo F | xcopy "%%k\%%l" "%%i:\biblioteca\historia\%%l" > nul)
for /f "tokens=1,* delims=\" %%k in ('dir /b /s %%a:\*.rtf') do (echo F | xcopy "%%k\%%l" "%%i:\biblioteca\historia\%%l" > nul)
)
)
Pause

Dime como ha ido. Y te reitero el agradecimiento por haberme descubierto el DISKPART. Permite hacer de forma más elegante la detección de discos extraíbles y volúmenes lógicos aunque temo que sea demasiado sensible al idioma ("Parti" seguramente también valdrá en inglés pero "Extra" de "Extraíble" seguro que no).

hola amigo le ejecute desde una usb

este fue el resultado

E:\>echo list volume 1>dskpart.txt
E:\>echo exit 1>>dskpart.txt
E:\>for /F "tokens=3" %i in ('diskpart /s dskpart.txt | find "Extra"') do (if ex
ist %i:\biblioteca\historia\ for /F "tokens=3" %a in ('diskpart /s dskpart.txt |
 find "Parti"') do (
for /F "tokens=1,* delims=\" %k in ('dir /b /s %a:\*.doc') do (echo F | xcopy
"%k\%l" "%i:\biblioteca\historia\%l" 1>nul )
 for /F "tokens=1,* delims=\" %k in ('dir /b /s %a:\*.docx') do (echo F | xcop
y "%k\%l" "%i:\biblioteca\historia\%l" 1>nul )
 for /F "tokens=1,* delims=\" %k in ('dir /b /s %a:\*.rtf') do (echo F | xcopy
 "%k\%l" "%i:\biblioteca\historia\%l" 1>nul )
) )
E:\>pause
Presione una tecla para continuar . . .

columen.txt (esta vacío)

teste.txt (esta vacío)

volume.txt (E:\teste.txt)

dskpart.txt (list volume exit)

gracias

perdón

columen.txt (esta vacío)
teste.txt (esta vacío)
volume.txt (E:\teste.txt)

son de otro ensayo que no funciono. también ejecute el bat en c:\ pero dio el mismo resuldado

esta mirando como estos código los discos locales.

FOR /F "usebackq tokens=1" %%x IN (`MOUNTVOL ^| FIND ":\"`) DO @ECHO %%x

FOR /F "usebackq tokens=1" %%a IN (`MOUNTVOL ^| FIND ":\"`) DO (
FOR /F "usebackq tokens=3" %%b IN (`FSUTIL FSINFO DRIVETYPE %%a`) DO (
IF /I "%%b" EQU "Removable" ECHO %%a ))

amigo tal cual esta el código cual seria la posible modificación para que se recree las carpetas en el proceso de copia?

Tal como está el código ya recrea las carpetas en el proceso de copia (lo hace el comando XCOPY). Por lo que veo en una parte del código que me copias intuyo que el problema está en que el idioma del ordenador en cuestión es el inglés ("Removable" en lugar de "Extraíble"). Ya te había comentado algo al respecto. Para contemplar ambas opciones es mejor usar FINDSTR

@echo off
echo list volume > dskpart.txt
echo exit >> dskpart.txt
for /f "tokens=3" %%i in ('diskpart /s dskpart.txt ^| findstr "Extra Remo"') do (
echo Unidad USB: %%i
if exist %%i:\biblioteca\historia\ for /f "tokens=3" %%a in ('diskpart /s dskpart.txt ^| find "Parti"') do (
echo Tratando volumen %%a
for /f "tokens=1,* delims=\" %%k in ('dir /b /s %%a:\*.doc') do (echo F | xcopy "%%k\%%l" "%%i:\biblioteca\historia\%%l" > nul)
for /f "tokens=1,* delims=\" %%k in ('dir /b /s %%a:\*.docx') do (echo F | xcopy "%%k\%%l" "%%i:\biblioteca\historia\%%l" > nul)
for /f "tokens=1,* delims=\" %%k in ('dir /b /s %%a:\*.rtf') do (echo F | xcopy "%%k\%%l" "%%i:\biblioteca\historia\%%l" > nul)
)
)
Pause

He incluido unos ECHO's de depuración para que puedas ver si detecta la unidad USB y los volúmenes montados.

Los comandos MOUNTVOL y FSUTIL FSINFO DRIVETYPE x: podrían servir para obtener la información sobre las unidades, pero creo que no aportan gran cosa frente al DISKPART. Al menos no he encontrado una opción que liste todos los dispositivos de un golpe.

Una curiosidad, ¿cómo obtienes y pegas esas ventanas con barra de desplazamiento en la página de todoexpertos?

Espero tus noticias. Me estás haciendo aprender mucho.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas