Saltar al contenido

Uso de un archivo por lotes para comprimir archivos como archivos zip individuales

Solución:

Quiero que cada archivo tenga su propio archivo zip y que el archivo zip comparta el nombre del archivo, menos la extensión, por supuesto.

Script por lotes

(Establezca las rutas de carpeta explícitas completas de origen y destino en la parte superior y luego ejecútelas según sea necesario. La fuente es donde existen los archivos que desea comprimir y el destino es donde desea que estén comprimidos).

@ECHO ON

SET SourceDir=C:foldersource
SET DestDir=C:folderdestination

CD /D "C:Program Files7-Zip"
FOR /F "TOKENS=*" %%F IN ('DIR /B /A-D "%SourceDir%"') DO (
    7z.exe a "%DestDir%%%~NF.zip" "%SourceDir%%%~NXF"
)
EXIT

Línea de comando

FOR /F "TOKENS=*" %F IN ('DIR /B /A-D "C:FolderSource"') DO 7z.exe a "C:FolderDest%~NF.zip" "C:FolderSource%~NXF"

Recursos adicionales

  • PARA / F
  • 7Zip – Comandos de la línea de comandos

Su secuencia de comandos original hace lo siguiente, línea por línea:

@echo on

Le dice al símbolo del sistema que imprima cada comando en el archivo por lotes antes de ejecutarlos. Esto es solo para que pueda “ver” lo que realmente está haciendo antes de que lo haga.

cd "C:UsersMVD21Desktoptest"

Cperchas Directory en lo que espero sea la ruta donde desea comprimir todos los archivos.

FOR %%i IN (C:UsersMVD21Desktoptest) DO 7z.exe a "%~ni.7z" "%i"

El parámetro para el IN aquí está (C:UsersMVD21Desktoptest). Esto hará que el bucle “cuerpo” (la acción detrás de la palabra clave DO) para ser ejecutado Exactamente una vez, con el %i parámetro asignado el valor C:UsersMVD21Desktoptest. ¡No es de extrañar que esto no haga lo que quieres! Parece que esto comprimiría todo el directorio en un solo archivo .7z.

Si lo hace nada, probablemente se deba a que no puede encontrar la ruta de 7z.exe. Si ese archivo no está en el directorio actual (ese test directorio mencionado anteriormente), entonces tendrá que estar en el PATH (en el %PATH% Variable ambiental; tratar echo %PATH% en un shell para ver lo que está configurado actualmente). De lo contrario tienes que copiar 7z.exe al directorio actual o especificar una ruta absoluta a su ubicación (como, por ejemplo, "C:Program Files7-zip7z.exe" ...).

pause

Cuando finaliza el script, esta palabra clave simplemente le dice al shell que espere a que presione enter o cierre el símbolo del sistema en lugar de salir inmediatamente.


Cuando está creando un script por lotes (o, de hecho, cualquier otra cosa que se ocupe del código), debe dejar de tratar el script completo como una copia y pegar monolítica que no (intenta) entender, y en su lugar desglosa su problema en subpartes que puede resolver individualmente, luego engánchelas. Esto le permitirá resolver problemas de forma independiente y crear soluciones en lugar de pedirle a otra persona que haga todo el trabajo por usted. Lo recomiendo altamente.

En su caso, tiene los siguientes subcomponentes de su problema:

  1. Itere (recorra en bucle) cada archivo contenido dentro de un directorio determinado.
  2. Para cada archivo dado, colóquelo en un archivo .7z invocando el 7z utilidad.

Las posibilidades de que alguien ya tenga una respuesta que resuelva su necesidad específica es menor que la posibilidad de poder encontrar las piezas más generales individualmente.

Esta pregunta, ‘Cómo hacer algo con cada archivo en un directorio en un script por lotes’ resuelve la mitad de su problema.

La idea central de la respuesta es que simplemente comienza con esta parte de esa respuesta de StackOverflow:

for /f "usebackq delims=|" %%f in ('dir /b "c:program files"') do echo %%f

y cambia la parte donde está haciendo algo (los echo %%f) hacer que quieres hacer. Sé que necesitas cambiar esa parte, porque he analizado el texto del script y entendí lo que significa cada carácter y parámetro, por lo que puedo razonar sobre dónde quiero insertar mi propio código.

Aquí hay un “código de aire” (¡no probado!):

for /f "usebackq delims=|" %%f in ('dir /b "C:UsersMVD21Desktoptest"') do 7z.exe a "%~ni.7z" "%i"

los @echo on y pause las declaraciones anteriores son una buena práctica, por lo que puede dejarlas. cd declaración también, si sus archivos se encuentran en esa ruta.

Entonces, ¿qué nos deja eso?

@echo on
cd "C:UsersMVD21Desktoptest"
for /f "usebackq delims=|" %%f in ('dir /b "C:UsersMVD21Desktoptest"') do 7z.exe a "%~nf.7z" "%f"
pause

Si responde con “¡No funciona!”, NO te ayudaré. Si prueba esto y no funciona, DEBE dime en los comentarios la siguiente información:

  • Qué exacto mensaje de error ¿aparece en el símbolo del sistema cuando ejecuta estos comandos o los coloca en un archivo por lotes y los ejecuta? No abrevie; copie y pegue la salida directamente (colóquela en http://pastebin.com si es mucho).
  • Qué es lo que tú pensar el mensaje de error le dice que el problema es?
  • ¿Dónde se encuentra su instalación de 7-zip (la ruta del archivo)?
  • ¿Se incluye la ubicación del archivo de su instalación 7-zip dentro del contenido de la PATH ¿Variable ambiental? (marque esto, como se mencionó anteriormente, con echo %PATH% en un cmd inmediato.)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *