Usar un archivo por lotes para comprimir archivos como archivos zip individuales


10

Así que estoy tratando de usar 7zip en un archivo por lotes para tomar los archivos en una carpeta y comprimirlos como archivos individuales. Entonces, el primer archivo obtiene su propio archivo zip, y el siguiente y así sucesivamente. Estuve buscando en Internet y probé varios códigos diferentes. Hasta ahora solo logré comprimirlos con éxito como un único archivo zip y se envió a mi escritorio.

Desafortunadamente, perdí el código que hizo eso, y ahora estoy atascado con esto que parece no hacer nada.

@echo on
cd "C:\Users\MVD21\Desktop\test"
FOR %%i IN (C:\Users\MVD21\Desktop\test) DO 7z.exe a "%~ni.7z" "%i"
pause

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.

Cualquier ayuda es muy apreciada.


Además, si hay una manera más fácil de hacer esto usando la función zip integrada en Windows 10, también estaría bien.
Mike Van Dunk el

Respuestas:


4

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 ejecute según sea necesario. La fuente es donde existen los archivos que desea comprimir y el destino es donde desea que se compriman).

@ECHO ON

SET SourceDir=C:\folder\source
SET DestDir=C:\folder\destination

CD /D "C:\Program Files\7-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:\Folder\Source"') DO 7z.exe a "C:\Folder\Dest\%~NF.zip" "C:\Folder\Source\%~NXF"

Recursos adicionales


4

Su script 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:\Users\MVD21\Desktop\test"

C Hanges D irectorio en lo que espero es la ruta en la que desea comprimir todos los archivos.

FOR %%i IN (C:\Users\MVD21\Desktop\test) DO 7z.exe a "%~ni.7z" "%i"

El parámetro para el INaquí es (C:\Users\MVD21\Desktop\test). Esto hará que el "cuerpo" del bucle (la acción detrás de la palabra clave DO) se ejecute exactamente una vez , con el %iparámetro asignado al valor C:\Users\MVD21\Desktop\test. ¡No es sorprendente que esto no haga lo que quieres! Parece que esto comprimiría todo el directorio en un solo archivo .7z.

Si no hace nada , probablemente sea porque no puede encontrar el camino de 7z.exe. Si ese archivo no está en el directorio actual (ese testdirectorio mencionado anteriormente), entonces tendrá que estar en PATH(en la %PATH%variable de entorno; intente echo %PATH%en un shell para ver en qué está configurado actualmente). De lo contrario, debe copiar 7z.exeen el directorio actual o especificar una ruta absoluta a donde se encuentra (como, por ejemplo, "C:\Program Files\7-zip\7z.exe" ...).

pause

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


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

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

  1. Iterar (recorrer) cada archivo contenido en un directorio dado.
  2. Para cada archivo dado, colóquelo en un archivo .7z invocando la 7zutilidad.

Las posibilidades de que alguien tenga una respuesta que resuelva sus necesidades específicas es menor que la posibilidad de encontrar las piezas más generales individualmente.

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

El objetivo de la respuesta es que solo 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 en la que está haciendo algo (el echo %%f) para hacer lo que quieres hacer . Sé que debe cambiar esa parte, porque analicé 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 aéreo" (¡no probado!):

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

Las declaraciones @echo ony pauseanteriores son una buena práctica, por lo que puede dejarlas. Y probablemente también quiera guardar esa cddeclaración, si sus archivos se encuentran en esa ruta.

Entonces, ¿qué nos deja eso?

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

Si respondes con "¡No funciona!", NO te ayudaré. Si intenta esto y no funciona, DEBE decirme en los comentarios la siguiente información:

  • ¿Qué mensaje de error exacto aparece en el símbolo del sistema cuando ejecuta estos comandos o los coloca en un archivo por lotes y los ejecuta? No abreviar; copie y pegue el resultado directamente (póngalo en http://pastebin.com si es mucho).
  • ¿Qué crees que el mensaje de error te dice que es el problema?
  • ¿Dónde se encuentra su instalación de 7-zip (la ruta del archivo)?
  • ¿La ubicación del archivo de su instalación de 7-zip está incluida en el contenido de la PATHvariable de entorno? (marque esto, como se mencionó anteriormente, con echo %PATH%un cmdaviso).

¿No creo que esto funcione porque tengo 7zip instalado en otra unidad? Parece funcionar si hago cd "Ubicación de 7zip" como en la respuesta original. Por supuesto, eso solo funciona "a veces". Funcionó hasta que puse otra declaración de eco debajo y ahora no lo es. Y sí, estoy tratando de entender más acerca de los archivos por lotes. He estado tratando de encontrar un glosario de comandos por lotes o qué no estudiar, así que realmente lo entiendo. Confía en mí, prefiero entenderlo y hacer que funcione que simplemente hacerlo funcionar.
Mike Van Dunk

Probé su solución y no puedo decirle cuál es el resultado porque el archivo por lotes no se ejecuta en absoluto. Se abre brevemente con la ventana cmd parpadeando y luego se cierra de nuevo. Sí, tengo la pausa allí. Tengo 7zip instalado en mi unidad local y en una unidad interna secundaria, pero no parece ser parte del entorno de la ruta
Mike Van Dunk

Realmente me gustaría entenderlo, pero buscar en google no ayuda mucho. Por ejemplo, no tengo idea de qué es ese comando o parámetro "'dir / b" o qué está haciendo. Sé que dir obviamente es un directorio, pero no sé qué es el / b. Lo que me gustaría es que alguien explique qué están haciendo los parámetros para que pueda entender mejor. O si alguien tiene un enlace a un sitio donde revisa este tipo de cosas que también serían útiles. Busqué en Google 'dir / b en un archivo por lotes y realmente no pude encontrar nada. Creo que / b tiene algo que ver con los nombres de los archivos, pero no estoy seguro.
Mike Van Dunk
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.