13.11.17

Compresión de archivos 7z por lotes

Ya son varias las ocasiones en las que echo en falta una función en 7zip que Rar sí incluía en su GUI, que era la de poder generar varios archivos zip (o 7z) de varios archivos distintos. O sea, que si yo tengo en un directorio tres archivos, llamados file01.txt, file02.txt, y file03.txt, la intención es que genere file01.7z, file02.7z y file03.7z a la vez y de golpe, sin tener que ir haciéndolo uno a uno. Con la aplicación de 7zip esto no es posible, y solo permite generar un único archivo de varios distintos a la vez, pero no uno diferente de cada uno de ellos.

Investigando, descubrí que hay una solución para ello si recurrimos a la versión de 7zip en modo consola (7za.exe), la cual nos facilita la tarea desde línea de comandos. El problema es que claro, hay que escribir un comando, con todo el engorro que eso supone (además, ya sabéis que no me gusta nada). Una solución intermedia es crear un script (un archivo .bat, en este caso) que nos lo automatice.




Mi intención no era quedarme ahí, sino realizar esa llamada al ejecutable e incluirlo todo ello en una GUI que lo hiciera. Esto pensaba desarrollarlo siempre y cuando fuera algo fácil y rápido, pero me he encontrado con varios problemas a la hora de pasar los parámetros con Delphi, que podían hacer que no funcionase en todas las versiones de Windows y no fuera, por lo tanto, muy genérico, así que decidí no continuar.

Lo que sí hice fueron los .bat, que os los dejo al final para quien los necesite. Se trata de dos archivos diferentes, uno de ellos nos dará como resultado archivos comprimidos en .7z, y el otro en .zip, pudiendo elegir el que necesitemos en cada caso.

El funcionamiento de esos .bat es muy simple, y os lo voy a explicar tomando de ejemplo el que genera archivos comprimidos en .7z, que es éste:

@echo off
for %%f in ("*.*") do 7za a -t7z %%~nf.7z %%f>NUL
del 7za.7z
del 7ziprun.7z
echo Se ha concluido el trabajo (7z).
pause
exit


Como cualquier bat, apagamos el eco en la primera línea. La segunda no es más que un bucle, y nos dice que todos los archivos (*.*) vayan ejecutándose en el 7za (7za.exe) con los parámetros "a" (que es "añadir") y en compresión de tipo 7z. Como recordaréis, el signo "%" (que puede sustituirse por "%%") representa una variable cualquiera, en este caso para meter los nombres de los archivos. La parte final es solamente el formato de comando que reconoce 7z, diciéndole que renombre el archivo a 7z para que reconozca esa extensión.

La tercera y cuarta línea son dos borrados (recordaréis el comando "del" de MS-DOS), como los propios archivos bat y exe también se incluyen en la compresión, para que no molesten, los eliminamos al final.

Cierro el archivo por lotes con un mensaje de información, para que sepamos que ya ha terminado la compresión, y a continuación esperamos a que el usuario presione cualquier tecla para cerrar la shell.

Cómo usarlo
Para usarlo es muy simple, y supongo que a estas alturas la mayoría lo sabréis, pero para los demás, lo explicaré brevemente: simplemente cogemos los archivos que queramos comprimir, y los pegamos en la carpeta donde tengamos el "7za.7z" y el "7ziprun.7z" (o, en su caso, si queremos comprimir en .zip, el "7za.exe" y el "run.bat"). Ejecutamos el script con doble click sobre el archivo .bat, y está.

Otra opción es copiar los dos archivos (el exe y el bat) y ponerlo en la carpeta donde tengamos los archivos que queramos comprimir.

Como veis, es muy sencillo. Claro que hubiera sido más cómodo hacerlo con una GUI, pero eso se lo dejaré a los creadores del 7zip, a ver si en un futuro implementan esta función.

- Link de descarga de los scripts (para Windows, obviamente)-.

| Redacción: Bianamaran.blogspot.com

2 comentarios:

  1. Gracias por compartirlo.
    7za es la versión ANSI para Windows 9x. Si los archivos tienen caracteres extendidos mejor la unicode: 7z.exe

    ResponderEliminar
  2. gracias Guti, no lo sabía. En cualquier caso partiendo de esos archivos, creo que es fácil para cualquiera retocarlo para que pueda funcionar con 7z.exe.

    Gracias de nuevo

    ResponderEliminar