Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: mario290386 en 18 Octubre 2016, 23:33 pm



Título: No consigo copiar archivos segun su tamaño en .bat
Publicado por: mario290386 en 18 Octubre 2016, 23:33 pm
Hola, lo primero saludar a toda la comunidad :-*, Me llamo Mario y tengo un problema que espero me pueda ayudar algún entendido del tema.

Resulta que por el trabajo que desempeño a diario necesito estar continuamente copiando información de bases de datos  que se encuentra almacenada en varios ordenadores y las paso a diferentes USB o unidades extraíbles,  por lo que estoy usando la siguiente rutina para hacer el proceso más cómodo, y la verdad que funciona muy bien:

IF NOT EXIST ".\cosas\"%USERNAME% MD ".\cosas\"%USERNAME%cd ".\cosas\"%USERNAME%

for /R %USERPROFILE%\Pictures\ %%x in (*.accdb) do copy "%%x" "%NOMBRE%BASE-DATOS"

Pues bien, el  problema que tengo es que necesito sólo copiar algunos archivos que no superen un cierto tamaño, por ejemplo solo necesito copiar que se copien los archivos que pesen menos de 200 mb.

 He visto por internet algunos ejemplos de cómo se hace el comando, pero no consigo insertarlo en la rutina mia anterior, por ejemplo,  he intentado utilizar esto:

for /R %USERPROFILE%\Pictures\ %%x in (*.accdb) do copy "%%x" "%NOMBRE%BASE-DATOS"/MAX:1000

Pero no me funciona, no sé si hay que colocar el parametro “MAX:” en otro lugar o es que no se hace de esta manera, pero yo necesito que en el script que utilizo pueda insertar ese parámetro de alguna manera.

Espero que alguien me pueda ayudar porque esto me lleva de cabeza ya bastante tiempo y es un engorro que se me copien todos los archivos y no poder separarlos por fecha o por tamaño.

Un saludo y gracias!!.


Título: Re: No consigo copiar archivos segun su tamaño en .bat
Publicado por: Eleкtro en 19 Octubre 2016, 01:25 am
He visto por internet algunos ejemplos de cómo se hace el comando, pero no consigo insertarlo en la rutina mia anterior, por ejemplo,  he intentado utilizar esto:

for /R %USERPROFILE%\Pictures\ %%x in (*.accdb) do copy "%%x" "%NOMBRE%BASE-DATOS"/MAX:1000

Pero no me funciona, no sé si hay que colocar el parametro “MAX:” en otro lugar o es que no se hace de esta manera

Hola.

Desconozco donde habrás visto eso, pero te aseguro que el comando Copy no proporciona ningún parámetro ni ninguna otra forma que se te pueda ocurrir para realizar ese tipo de operación de copiado individual y selectivo por tamaño, sencillamente eso de "/MAX:n" no existe, te has debido confundir con lo que viste.

Dicho esto, para solucionar el problema que describes simplemente puedes usar el modificador de variable especial de For "~z" para obtener y al mismo tiempo evaluar/comparar el tamaño, en bytes, de cada archivo de la iteración. Ejemplo:

Código
  1. @Echo OFF
  2.  
  3. Set /A "maxFilesize=209715200" & REM 200 Megabytes
  4.  
  5. For /R "%USERPROFILE%\Pictures\" %%x in ("*.accdb") Do (
  6. If %%~zx LSS %maxFilesize% (
  7. Copy "%%~fx" "%NOMBRE%BASE-DATOS"
  8. )
  9. )
  10.  
  11. Pause & Exit /B 0

Por último, ten en cuenta que el valor máximo que puedes especificar en la variable maxFilesize es 2.147.483.647 (2 gigabytes), o dicho de otra forma, el valor máximo de un entero de 32 bits de precisión, esa es la capacidad aritmética de operación en Batch. Sin embargo esto no afecta de ningún modo al valor máximo que puede devolver el modificador "~z" así que no devolverá falsos positivos ni nada por el estilo... en resumen, que si te es suficiente con tener un margen de comparación de hasta 2 gigas entonces no hay de que preocuparse, pero este tipo de evaluaciones son muy lentas en Batch, en comparación con cualquier otro lenguaje de hoy en día, y me refiero al simple hecho de enumerar los archivos de un directorio, es demaisiado lento y el impacto negativo es "5 veces mayor" si imprimes texto en la consola, así que... en Windows y sin necesidad de instalar intérpretes yo te recomendaría que migrases ese código, de Batch a PowerShell, o a VBS.

Saludos