¿Cómo puede comprimir o descomprimir del script usando SOLO las capacidades integradas de Windows?

294

En Windows puedes comprimir algunos archivos por

clic derecho → Enviar aCarpeta comprimida (comprimida)

Y descomprimir haciendo doble clic en el .ziparchivo y extraer los archivos.

¿Hay alguna manera de aplicar esas habilidades desde un script (archivo .bat) sin la necesidad de instalar ningún software de terceros ?

Roee Gavirel
fuente
16
Bueno, probablemente sea para llamarlo desde un archivo por lotes o un programa. (Es por eso que estoy aquí, tratando de hacer un archivo .BAT rápido para "construir" un pequeño producto para un sitio web que requiere que sea un archivo zip.)
Jon Coombs
46
Loco que esta pregunta estaba cerrada.
Sam Goldberg
1
¿Es posible trasladar esta pregunta a Superusuario?
Hanxue
21
Sigue siendo muy útil y relevante en 2018.: P
Michael Fever

Respuestas:

82

En 2013, eso no era posible. Microsoft no proporcionó ningún ejecutable para esto.

Vea este enlace para ver alguna forma de VBS de hacer esto. /superuser/201371/create-zip-folder-from-the-command-line-windows

Desde Windows 8 en adelante, .NET Framework 4.5 está instalado de manera predeterminada, con System.IO.Compression.ZipArchive y PowerShell disponibles, uno puede escribir scripts para lograr esto, consulte https://stackoverflow.com/a/26843122/71312

Diryboy
fuente
1
Esto no es correcto dado que PS lo permite y está preinstalado en Windows y está disponible a través de la línea de comandos.
Dan Atkinson
44
@DanAtkinson Actualizado. Fue respondido en 2013, el enlace proporcionó alguna forma de VBS. El modo PS necesita .Net 4.5, que necesita Windows 8 o superior.
Diryboy
¡Gracias por la actualización! He modificado mi voto en consecuencia. :)
Dan Atkinson
66
@MichaelMrozek Bueno, la "línea de comando" se refiere genéricamente a cualquier línea de comando, no específicamente CMD / COMMAND, y PS definitivamente es una línea de comando, como es bash, sh, rsh en * nix. Pero solo para ir más allá, ya que puede ejecutar PowerShell desde la línea de comando, responde la pregunta incluso si desea creer que cmd / command es la única línea de comando.
Robert McKee
1
Que era posible volver en 2013 (sin necesidad de instalar ningún software adicional). Ver la pregunta del Superusuario . Ha sido posible desde que salió Windows XP en 2001. La funcionalidad ZIP incorporada en Windows XP se puede aprovechar porque está expuesta a través de una interfaz COM .
Peter Mortensen
180

Para ampliar la solución PowerShell de Steven Penny, puede incorporarla a un archivo por lotes llamando a powershell.exe de esta manera:

powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', 'bar'); }"

Como dijo Ivan Shilo, esto no funcionará con PowerShell 2, requiere PowerShell 3 o superior y .NET Framework 4.

Jason Duffett
fuente
1
En realidad, esto estuvo disponible en .NET 4.5.
qJake
10
Para aquellos (como yo) que se preguntan cómo extraer en el directorio real (en lugar de crear un nuevo directorio) simplemente configure el parámetro de destino en '.', por ejemplo:powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.'); }"
Munchkin
¿Podemos usar estos comandos para aumentar la compresión? ¿Como hacer que sea Ultra compresión para reducir el tamaño del archivo?
Nigel Fds
1
¿Para qué sirve & {}? Con PS5 esto también funciona:powershell.exe -nologo -noprofile -command "Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.');"
Roi Danton
@RoiDanton ¿Cómo usar stringformatter para definir src.zip y dest.zip?
PySaad
161

A partir de .NET 4.5 , PowerShell puede hacer esto:

Add-Type -A System.IO.Compression.FileSystem
[IO.Compression.ZipFile]::CreateFromDirectory('foo', 'foo.zip')
[IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', 'bar')

Para las dos últimas líneas, bary foose puede reemplazar con el nombre que desea que tenga la carpeta, o cualquiera que sea el nombre de la carpeta preexistente. foo.zipen ambos casos actúa como archivo zip para guardar como o descomprimir.

Steven Penny
fuente
17
Esto es a partir de .NET 4.5.
qJake
¿Podemos usar estos comandos para aumentar la compresión? ¿Como hacer que sea Ultra compresión para reducir el tamaño del archivo?
Nigel Fds
Tengo .NET v4.0.30319, v2.0.50727, v1.1.4322, v1.0.3705 instalado a través de una VM instalada desde aquí: developer.microsoft.com/en-us/microsoft-edge/tools/vms , y esto funciona. así que supongo que no necesita .NET 4.5
alpha_989
Esta es la solución más práctica en los sistemas modernos, esto escribirá un archivo zip de más de 2GB de tamaño, mientras que el "Compress-Archive" estándar de Powershell fallará.
Shukri Adams
135

Si tiene Java instalado, puede comprimir a un archivo ZIP utilizando el jarcomando:

jar -cMf targetArchive.zip sourceDirectory

c = Crea un nuevo archivo comprimido.

M = Especifica que no se debe agregar un archivo de manifiesto al archivo.

f = Indica el nombre del archivo de destino.

Noam Manos
fuente
3
impresionante, gracias, justo lo que estaba buscando ... FYI - Tuve que eliminar el carácter negativo en DOS ... por ejemplo, jar cMf target.zip sourceDir
mlo55
3
No está mal, pero necesita el JDK instalado, no el JRE.
pdem
2
Buena, probablemente la solución más independiente de la plataforma para esto;)
Adrian
YMMD. idea increíble. me ahorro mucho tiempo.
Gorefest
3
¿Está cubierto por "... utilizando SOLO las capacidades integradas de Windows ?" (mi énfasis)
Peter Mortensen
84

PowerShell 5.0

Desde Microsoft.PowerShell.Archiveusted puede usar:

P.ej:

  • Crear result.zipdesde toda la Testcarpeta:

    Compress-Archive -Path C:\Test -DestinationPath C:\result
    
  • Extrae el contenido de result.zipen la Testcarpeta especificada :

    Expand-Archive -Path result.zip -DestinationPath C:\Test
    
RUMANIA_ingeniero
fuente
13
Esto funciona muy bien, gracias. Para cualquiera que termine aquí, puede usarlo powershell Compress-Archive -Path C:\SomeFile.ext -DestinationPath C:\SomeFile.zipdirectamente desde la línea de comandos sin necesidad de crear un script (suponiendo que tenga instalado Powershell v5, lo que puede hacer al menos volviendo a Windows 7).
Emite
Funciona muy bien, agregue la opción -Fuerza si planea volver a ejecutarla.
Robin Salih
1
@Beems, gracias! Pero creo que te enojaste con el camino / destino al revés.
Yiping
Esto funciona, pero el archivo se comprime de manera diferente entonces lo que ocurre si utiliza las ventanas de explorador "que se envíe A -> comprimida (en zip) carpeta" La versión de PowerShell es más grande y algunos programas no se puede extraer
Eric Labashosky
Compress-Archive tiene un límite de archivo máximo de 2 GB en el archivo de entrada
Sergei Rodionov
37

No es exactamente un ZIP, pero la única forma de comprimir un archivo usando las herramientas de Windows es:

makecab <source> <dest>.cab

Para descomprimir:

expand <source>.cab <dest>

Ejemplo avanzado (de ss64.com):

Create a self extracting archive containing movie.mov:
C:\> makecab movie.mov "temp.cab"
C:\> copy /b "%windir%\system32\extrac32.exe"+"temp.cab" "movie.exe"
C:\> del /q /f "temp.cab"

Más información: makecab , expand , usos avanzados de makecab

Federico Santamorena
fuente
34

Usando 7-Zip:

Zip : tiene una carpeta fooy desea comprimirla enmyzip.zip

"C:\Program Files\7-Zip\7z.exe" a  -r myzip.zip -w foo -mem=AES256

Descomprimir : desea descomprimirlo ( myzip.zip) en el directorio actual ( ./)

"C:\Program Files\7-Zip\7z.exe" x  myzip.zip  -o./ -y -r
Monir
fuente
31
Tenga en cuenta la pregunta:without the need to install any 3rd party
Roee Gavirel
16
Sin embargo, @RoeeGavirel 7zip debería ser una de las primeras cosas que instales en cualquier instalación de Windows: P
developerbmw
3
@developerbmw - A. ¿por qué? B. Estoy manejando ~ 100 máquinas en producción que no tienen 7zip en ellas. Para instalar eso, tendría que hacer que DevOps lo instale en todas esas máquinas y en todas las máquinas nuevas que se agregarán a los clústeres. Prefiero evitarlo.
Roee Gavirel
1
@Roland: ¿podrías ser espacífico? donde sale mal? Eso ayudará a todos.
Monir
1
@Roland: Acabo de marcar, la sintaxis funciona bien. Probablemente, está intentando con la carpeta "foo" que no está presente en su máquina. Solo adivina sin embargo.
Monir
9

He estado buscando responder esta pregunta exacta y, según mi investigación, la respuesta de DiryBoy parece ser precisa.

Encontré que el programa compact.exe comprime archivos pero no para crear un archivo altamente comprimido (o conjunto de archivos). Es similar a la opción que obtienes al hacer clic derecho en una letra de unidad o partición en Windows. Tienes la opción de hacer la limpieza (eliminar archivos temporales, etc.) así como comprimir archivos. Aún se puede acceder a los archivos comprimidos, pero solo se comprimen para crear espacio en una unidad con poco espacio.

También encontré compress.exe que tenía en mi computadora. No es nativo en la mayoría de las máquinas con Windows y es parte del kit de recursos de 2003. Realmente crea un tipo de archivo comprimido, pero es realmente más similar a los archivos de un disco de configuración de Windows (tiene el guión bajo como último carácter de la extensión o nombre del archivo). Y el comando extract.exe extrae esos archivos.

Sin embargo, el mantra es que si se puede hacer de forma nativa a través de la GUI, entonces es probable que haya una forma de hacerlo por lotes, .vbs o algún otro tipo de script dentro de la línea de comandos. Como Windows ha tenido la opción 'enviar a' para crear un archivo zip, sabía que tenía que haber una manera de hacerlo a través de la línea de comandos y encontré algunas opciones.

Aquí hay un excelente enlace que muestra cómo comprimir un archivo usando los comandos nativos de Windows.

/superuser/110991/can-you-zip-a-file-from-the-command-prompt-using-only-windows-built-in-capabili

Lo probé con un directorio que contenía múltiples archivos y carpetas anidados y funcionó perfectamente. Simplemente siga el formato de la línea de comando.

También hay una manera de descomprimir los archivos a través de la línea de comandos que encontré también. Una forma, solo abre una ventana del explorador que muestra cuál es el contenido del archivo comprimido. Algunos de estos también usan Java, que no es necesariamente nativo de Windows, pero es tan común que casi lo parece.

/superuser/149489/does-windows-7-have-unzip-at-the-command-line-installed-by-default

¿Cómo descomprimir un archivo usando la línea de comando?

Usuario Perdido
fuente
8

Puede usar un script VBScript envuelto en un archivo BAT. Este código funciona en una RUTA relativa.

No hay necesidad de herramientas o dependencias de terceros. Solo establece SOURCEDIRy OUTPUTZIP.

Nombre de archivo: ZipUp.bat

echo Set fso = CreateObject("Scripting.FileSystemObject") > _zipup.vbs
echo InputFolder = fso.GetAbsolutePathName(WScript.Arguments.Item(0)) >> _zipup.vbs
echo ZipFile = fso.GetAbsolutePathName(WScript.Arguments.Item(1)) >> _zipup.vbs

' Create empty ZIP file.
echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipup.vbs

echo Set objShell = CreateObject("Shell.Application") >> _zipup.vbs
echo Set source = objShell.NameSpace(InputFolder).Items >> _zipup.vbs
echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipup.vbs

echo ' Keep script waiting until compression is done
echo Do Until objShell.NameSpace( ZipFile ).Items.Count = objShell.NameSpace( InputFolder ).Items.Count >> _zipup.vbs
echo     WScript.Sleep 200 >> _zipup.vbs
echo Loop >> _zipup.vbs

CScript  _zipup.vbs  %SOURCEDIR%  %OUTPUTZIP%

del _zipup.vbs

Ejemplo de uso

SET SOURCEDIR=C:\Some\Path
SET OUTPUTZIP=C:\Archive.zip
CALL ZipUp

Alternativamente, puede parametrizar este archivo reemplazando la línea CScript _zipup.vbs %SOURCEDIR% %OUTPUTZIP%con CScript _zipup.vbs %1 %2, en cuyo caso se puede llamar aún más fácilmente simplemente llamando CALL ZipUp C:\Source\Dir C:\Archive.zip.

PodTech.io
fuente
La línea que crea el archivo zip inicial debe escaparse; de ​​lo contrario, no termina en el script.
Copa
Sí, este es el camino a seguir (como en la pregunta de Superusuario ).
Peter Mortensen
Agregué una versión con escape adecuado como respuesta.
fsteff
5

Tengo un problema con todas estas soluciones.

No son exactamente lo mismo, y todos crean archivos que tienen una ligera diferencia de tamaño en comparación con RMB --> send to --> compressed (zipped) foldercuando se crean desde la misma carpeta de origen. La diferencia de tamaño más cercana que he tenido es de 300 KB de diferencia (script> manual), hecha con:

powershell Compress-Archive -Path C:\sourceFolder -CompressionLevel Fastest -DestinationPath C:\destinationArchive.zip

(Observe el nivel de compresión . Hay tres valores posibles : Más rápido, Sin compresión y Óptimo, (Valor predeterminado: Óptimo))

Quería hacer un archivo .bat que comprima automáticamente una carpeta de plugin de WordPress en la que estoy trabajando, en un archivo .zip, para poder cargarlo en el sitio de WordPress y probar el plugin.

Pero por alguna razón no funciona con ninguna de estas compresiones automáticas, pero sí funciona con la compresión RMB manual, lo que me parece realmente extraño.

Y los archivos .zip generados por script realmente rompen los complementos de WordPress hasta el punto en que no se pueden activar, y tampoco se pueden eliminar desde dentro de WordPress. Tengo que SSH en la "parte posterior" del servidor y eliminar los archivos de complemento cargados ellos mismos, manualmente. Mientras que los archivos generados manualmente RMB funcionan normalmente.

Sebastian Norr
fuente
¿Qué es "wbr" y "RMB" ?
Peter Mortensen
RMB = Botón derecho del mouse. <wbr> = una etiqueta HTML que indica una "oportunidad de Word BReak" para el navegador (eliminada, porque no funcionó).
Sebastian Norr
4

Si necesita hacer esto como parte de un script, la mejor manera es usar Java. Suponiendo que el directorio bin está en su ruta (en la mayoría de los casos), puede usar la línea de comando:

jar xf test.zip

Si Java no está en su camino, haga referencia directamente:

C:\Java\jdk1.6.0_03\bin>jar xf test.zip
eddyoc
fuente
3

El código abierto es tu amigo :-)

Aquí está el descomprimir : http://gnuwin32.sourceforge.net/packages/unzip.htm

También hay un comando ZIP: http://gnuwin32.sourceforge.net/packages/zip.htm

La descarga de los binarios es suficiente.

JanBorup
fuente
En Windows 8, arroja un error: falta bzip2.dll.
Doug
1
@Doug dice que bzip2 es un requisito en la página y tiene un enlace para descargar
Sam
11
La pregunta original era cómo usar los comandos estándar de Windows integrados. Además, no es deseable que sus usuarios instalen varias soluciones de terceros porque su propia herramienta o solución ahora está limitada a los usuarios que tienen permiso administrativo en su computadora, o que no se preocupan por una creciente colección de pequeñas dependencias en su sistema . El código abierto puede ser tu amigo, pero los paquetes de código abierto que requieren que instales otros paquetes de código abierto que requieren que instales otros paquetes de código abierto, etc., definitivamente no son tus amigos.
Steve Hollasch
SourceForge está bloqueado por la política de firewall de mi trabajo :-(
SnookerC
1
Esto todavía utiliza software de terceros
Деян Добромиров
3

Esta es una versión actualizada de la respuesta proporcionada por @ PodTech.io

Esta versión tiene todo el código vbs escapado correctamente en el archivo por lotes. También se crea en una subrutina, que se puede llamar con una sola línea desde cualquier parte de su script por lotes:

:: === Main code:

call :ZipUp "C:\Some\Path" "C:\Archive.zip"


:: === SubRoutines:

:ZipUp
::Arguments: Source_folder, destination_zip
(
    echo:Set fso = CreateObject^("Scripting.FileSystemObject"^)
    echo:InputFolder = fso.GetAbsolutePathName^(WScript.Arguments.Item^(0^)^)
    echo:ZipFile = fso.GetAbsolutePathName^(WScript.Arguments.Item^(1^)^)
    echo:
    echo:' Create empty ZIP file.
    echo:CreateObject^("Scripting.FileSystemObject"^).CreateTextFile^(ZipFile, True^).Write "PK" ^& Chr^(5^) ^& Chr^(6^) ^& String^(18, vbNullChar^)
    echo:
    echo:Set objShell = CreateObject^("Shell.Application"^)
    echo:Set source = objShell.NameSpace^(InputFolder^).Items
    echo:objShell.NameSpace^(ZipFile^).CopyHere^(source^)
    echo:
    echo:' Keep script waiting until compression is done
    echo:Do Until objShell.NameSpace^( ZipFile ^).Items.Count = objShell.NameSpace^( InputFolder ^).Items.Count
    echo:    WScript.Sleep 200
    echo:Loop
)>_zipup.vbs
CScript //Nologo _zipup.vbs "%~1" "%~2"
del _zipup.vbs
goto :eof
fsteff
fuente
2

Dices que estás tratando de hacer esto sin un software de terceros. No estoy seguro si consideraría el software .NET de "terceros".

Pero puede crear su propia utilidad de línea de comandos en .NET. No debería requerir más que unas pocas líneas de código.

Clase ZipFile

NL3294
fuente
0

Agregando la respuesta de @Jason Duffett y sus comentarios, aquí hay un script que obtiene entrada y salida (nombre de archivo y nombre de directorio, respectivamente) del usuario:

@echo off
set input=%1
set output=%2
powershell.exe "Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('%input%', '%output%');"

Uso:

unzip.bat path\to\file.zip path\to\output\directory
Hola judeo
fuente
-4

Para comprimir un archivo:

C:\> zip -9 -m -o file.dat.zip file.dat
  • -9 compresión máxima
  • -m eliminar el archivo original después de una compresión exitosa
  • -o establecer la fecha de modificación del archivo zip igual que el archivo original
  • lástima que uno tenga que darle el nombre del archivo zip deseado en lugar de simplemente agregar la extensión .zip al nombre del archivo para comprimir
Tulains Córdova
fuente
44
dos cosas: (1) "zip" no se proporciona con windows, por lo que es probable que sea un tercero que tenga. y como mencioné mi pregunta, no puedo instalar terceros. (2) La razón por la que necesita proporcionar el nombre deseado es porque crear y archivar archivos comprimidos (como una carpeta en una sesión) y es posible que tenga más de un archivo allí.
Roee Gavirel
@RoeeGavirel En el servidor encontré la utilidad de línea de comando zip, no hay una herramienta GUI winzip instalada, así que supuse que la herramienta CLI simple venía con Windows. Por otro lado, las utilidades de compresión Unix / Linux como compress, bzip2 y gzip crean un archivo comprimido con el mismo nombre del archivo original más la extensión (.Z, .bz2 o .gz), si no pasa el nombre deseado archivo comprimido.
Tulains Córdova
-4

Puede descomprimir un archivo comprimido de Windows comprimido o nativo utilizando el comando Expandir , p. Ej.

expand MyFile.zip myFile
lanza
fuente
99
Lo intenté, pero copia MyFile.zip a la carpeta myFile,
fhnaseer
Esto me ayudó C: \> expand /?
snow6oy
11
Expandir solo funciona con archivos .cab y no es apropiado para archivos zip.
рüффп
2
Lo mismo ocurre con los otros comentarios aquí. Expand file.zip filesimplemente copia el zip a otro archivo sin la extensión. No descomprime el ZIP en una carpeta.
Dave Marley