Crear carpeta .zip desde la línea de comandos - (Windows)

57

¿Es posible crear un archivo .zip desde una carpeta en la línea de comando? No quiero usar ningún ejecutable de terceros.

Estaba pensando en algo como 'enviar a carpeta comprimida' pero no sé cómo hacerlo ...

Steven Penny
fuente
2
Hay una herramienta en el kit de recursos de Windows llamada compress.exe.
ho1
2
Aquí hay un enlace a una pregunta de ServerFault que trata solo esto: serverfault.com/questions/39071/…
ho1

Respuestas:

7

No creo que haya una línea de comando para los archivos ZIP integrados en Windows (excepto compressen el Kit de recursos de Server 2003). Tendrías que usar un tercero. ¡Todo el mundo ama a 7zip !

EMMERICH
fuente
6

He combinado este script de varias fuentes diferentes para satisfacer mejor mis necesidades. Copie y pegue el script en un archivo con la extensión ".vbs". El script se creó originalmente para Windows XP, pero también funciona en Windows 7 x64 Ultimate; no hay garantía de que Windows se mantenga cerca de los diversos objetos Shell que usa.

Uso: en el cuadro de ejecución o en la línea de comando

"C:\zipper.vbs" "C:\folderToZip\" "C:\mynewzip.zip"

Ruta de la secuencia de comandos, carpeta de origen, archivo zip para crear (incluya .zip al final).

No copiará carpetas vacías, así que tenga cuidado.

Aquí está el código vbs ---

Set Args = Wscript.Arguments
source = Args(0)
target = Args(1)

' make sure source folder has \ at end
If Right(source, 1) <> "\" Then
    source = source & "\"
End If

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set zip = objFSO.OpenTextFile(target, 2, vbtrue)
' this is the header to designate a file as a zip
zip.Write "PK" & Chr(5) & Chr(6) & String( 18, Chr(0) )
zip.Close
Set zip = nothing

wscript.sleep 500

Set objApp = CreateObject( "Shell.Application" )
intSkipped = 0

' Loop over items within folder and use CopyHere to put them into the zip folder
For Each objItem in objApp.NameSpace( source ).Items
    If objItem.IsFolder Then
        Set objFolder = objFSO.GetFolder( objItem.Path )
        ' if this folder is empty, then skip it as it can't compress empty folders
        If objFolder.Files.Count + objFolder.SubFolders.Count = 0 Then
            intSkipped = intSkipped + 1
        Else
            objApp.NameSpace( target ).CopyHere objItem
        End If
    Else
        objApp.NameSpace( target ).CopyHere objItem
    End If
Next

intSrcItems = objApp.NameSpace( source ).Items.Count
wscript.sleep 250

' delay until at least items at the top level are available
Do Until objApp.NameSpace( target ).Items.Count + intSkipped = intSrcItems
    wscript.sleep 200
Loop

'cleanup
Set objItem = nothing
Set objFolder = nothing
Set objApp = nothing
Set objFSO = nothing
WSkid
fuente
1
Parece prometedor, pero recibí un error "Objeto requerido: 'objApp.NameSpace (...)' en la línea 16
pihentagy
Tengo el mismo problema. El código anterior no funciona o necesita algunas cosas adicionales en el sistema que el póster olvidó mencionar.
Shaamaan 01 de
Utiliza WScript (entorno vbs) y varios objetos Shell. Todos se instalaron por defecto en Windows XP (¿negocios?) Y Win 7 Ultimate x64. ¿Quizás están más tiempo allí para Win8?
WSkid
2

Es posible ejecutar el script de PowerShell desde BAT. La ruta de recepción del archivo bat al directorio que se va a comprimir y el nombre del archivo zip como parámetros.

@echo off
setlocal

rem First parameter - path to dir to be zipped
rem Second parameter- zip file name
set sourceDir=%1
set zipFile=%2

rem Create PowerShell script
echo Write-Output 'Custom PowerShell profile in effect!'    > %~dp0TempZipScript.ps1
echo Add-Type -A System.IO.Compression.FileSystem           >> %~dp0TempZipScript.ps1
echo [IO.Compression.ZipFile]::CreateFromDirectory('%sourceDir%','%~dp0%zipFile%') >> %~dp0TempZipScript.ps1

rem Execute script with flag "-ExecutionPolicy Bypass" to get around ExecutionPolicy
PowerShell.exe -ExecutionPolicy Bypass -Command "& '%~dp0TempZipScript.ps1'"
del %~dp0TempZipScript.ps1
endlocal
cam029
fuente
1
Pero, ¿cuál sería la ventaja de este enfoque? ¿Por qué no simplemente escribir el script de PowerShell en un archivo fijo y dejar que acepte parámetros?
Seth
Intenté todas las otras soluciones. Esta es la única solución a prueba de fallas que funciona perfectamente. La ventaja más importante es el uso de los comandos nativos de powershell y no es necesario crear el VBScript de tecnología antigua.
desmati
Esto funcionó para mí en un viejo portátil corporativo
windows7
1

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

¿Puede comprimir un archivo desde el símbolo del sistema utilizando SOLO la capacidad integrada de Windows para comprimir archivos?

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.

¿Windows 7 tiene descomprimir en la línea de comandos instalada por defecto?

https://stackoverflow.com/questions/1021557/how-to-unzip-a-file-using-the-command-line

Usuario Perdido
fuente
3
Debe incluir las instrucciones en su respuesta. Si los enlaces se vuelven obsoletos, su respuesta será inútil ...
MoonSire
1

Esta es una vieja pregunta, pero su relevancia aún es actual.

Windows, por supuesto, tiene su propio algoritmo de compresión incorporado para usar archivos zip, pero realmente funciona mal en comparación con el producto de código abierto 7zip que se encuentra aquí http://www.7-zip.org/

Otros ya han discutido varios métodos para usar las funciones integradas de Windows, mi solución requiere instalar el software adicional.

7Zip admite una amplia gama de archivos, incluidos ZIP, RAR, CAB e ISO y su propio formato 7z.

Puede ver la ayuda de la línea de comandos: "C: \ Archivos de programa \ 7-Zip \ 7z.exe" --ayuda

para realizar una simple adición al archivo zip:

"C: \ Archivos de programa \ 7-Zip \ 7z.exe" a filename.zip c: \ path

Dwight Wilbanks
fuente
1

Aquí hay otra idea, de 4 fuentes diferentes; no mis ideas, pero las compilé para que funcionen para mí

<!-- : Begin batch script
@each off

set sourceFolder="c:\test"
set destZip="%userprofile%\desktop\example.zip"

cscript //nologo "%~f0?.wsf" //job:exewsh %sourceFolder% %destZip%

exit /b
GOTO:EOF
----- Begin wsf script --->
<package><job id="exewsh"><script language="VBScript">
'Get command-line arguments.
Set objArgs = WScript.Arguments
InputFolder = objArgs(0)
ZipFile = objArgs(1)

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

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

'Required!
wScript.Sleep 2000
</script></job>
</package>
eyeH8bingDotCom
fuente
2
¡Bienvenido a Super User ! Obviamente, este es un guión complicado. ¿Podría explicar qué hace y cómo usarlo?
jpaugh
1

Imagine que desea comprimir la misma carpeta que está en el símbolo del sistema SIN abrir una ventana de PowerShell:

powershell Compress-Archive . publish.zip
Wagner Bertolini Junior
fuente
Eso no fue lo que me propuse hacer, pero ahora funcionará para mí. Es un truco útil para saber.
bballdave025
0

Publicaré algo relacionado con la respuesta de WSkids ya que lamentablemente no puedo usar la función de comentario.

El uso del método CopyHere () en VBS presenta varios problemas. Uno de estos problemas es que el método regresa inmediatamente mientras el proceso de copia comienza en segundo plano, mientras que varias llamadas CopyHere () se interferirán entre sí y el ZIP no se creará correctamente. Aquí se necesita un bucle de espera para arreglar eso. Mi ciclo de espera se basa en una respuesta a un problema similar publicado aquí .

Aquí hay una versión actualizada que corrige el error "Objeto requerido" reportado por pihentagy . Es un problema de tiempo ya que el archivo ZIP recién creado se incluye en la colección Items cuando el script se ejecuta en máquinas rápidas.

set Args = WScript.Arguments
source = Args(0)
' remove trailing slashes as we add slashes when needed later
while Right(source, 1) = "\"
    source = Mid(source, 1, Len(source) - 1)
wend

target = Args(1)

' create empty ZIP file
set fso = CreateObject("Scripting.FileSystemObject")
set zip = fso.OpenTextFile(target, 2, vbtrue)
' write ZIP header, this ensures that Windows recognizes the file as "ZIP Folder"
zip.Write "PK" & Chr(5) & Chr(6) & String(18, Chr(0))
zip.Close
set zip = nothing
set fso = nothing

' copy files to ZIP file
set app = CreateObject("Shell.Application")

set sourceFolderObj = app.NameSpace(source)
set targetFolderObj = app.NameSpace(target)

for each item in sourceFolderObj.Items
  itemPath = source & "\" & item.Name

  copyItem = false

  ' ZIP file is included in Items collection and is recognized as folder, thus skip it to avoid script errors
  if itemPath <> target then
    if item.IsFolder then
      if item.GetFolder.Items().Count = 0 then
        ' folder is empty, skip it as empty folders can't be compressed
      else
        copyItem = true
      end if
    else
      copyItem = true
    end if
  end if

  if copyItem then
    targetFolderObj.CopyHere item

    ' wait until the file appears in the ZIP file, 
    ' this is needed because CopyHere() returns immediately after starting an asynchronous copy process 
    ' (starting multiple asynchronous copy will not work as it causes error messages, an invalid ZIP file, ...)
    while (targetFolderObj.ParseName(item.Name) is nothing)
      WScript.Sleep 1
    wend
  end If
next

set targetFolderObj = nothing
set sourceFolderObj = nothing
set app = nothing
ViRuSTriNiTy
fuente