2010-10-20 07:50:38 +0000 2010-10-20 07:50:38 +0000
63
63

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

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

Estaba pensando en algo como ‘enviar a una carpeta comprimida’ pero no sé cómo hacerlo…

Respuestas (10)

41
41
41
2015-04-06 21:26:20 +0000

A partir de PowerShell 5 (Febrero 2016), puedes usar “Compress-Archive”:

Compress-Archive -Path input.txt -DestinationPath output.zip

O:

Compress-Archive input.txt output.zip

input.txt aquí también podría haber un directorio https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.archive/compress-archive?view=powershell-5.1

7
7
7
2010-10-20 07:57:39 +0000

No creo que haya una línea de comandos para los archivos ZIP incorporados en Windows (aparte de compress en el Kit de Recursos del Servidor 2003). Tendrías que usar un tercero. A todo el mundo le encanta 7zip !

6
6
6
2010-10-20 08:32:39 +0000

He combinado este guión de varias fuentes diferentes para satisfacer mejor mis necesidades. Copie y pegue el guión en un archivo con la extensión “.vbs”. El script fue originalmente hecho para Windows XP, pero también funciona en Windows 7 x64 Ultimate - no hay garantía de que Windows se mantenga alrededor de los diversos objetos de Shell que utiliza.

Uso: en el cuadro de ejecución o línea de comandos put-

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

Ruta al script, carpeta de origen, archivo zip a hacer (incluye .zip al final).

No copiará carpetas vacías así que ten 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
4
4
4
2018-07-04 11:29:13 +0000

Imagina que quieres comprimir la misma carpeta en la que estás en el comando “prompt” SIN abrir una ventana de “powerhell”:

powershell Compress-Archive . publish.zip
2
2
2
2018-01-18 22:50:18 +0000

Aquí hay otra idea, de 4 fuentes diferentes; no son 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>
2
2
2
2016-11-30 12:19:08 +0000

Es posible ejecutar el script de PowerShell desde BAT. El archivo de BAT recibe la ruta al dir para ser comprimido 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
1
1
1
2013-11-15 04:21:10 +0000

Aquí hay un gran enlace que muestra cómo comprimir un archivo usando los comandos nativos de Windows. [ ¿Puedes comprimir un archivo desde el símbolo del sistema usando SOLO la capacidad incorporada de Windows para comprimir archivos? (https://superuser.com/questions/110991/can-you-zip-a-file-from-the-command-prompt-using-only-windows-built-in-capabili)

Lo probé con un directorio que contiene múltiples archivos y carpetas anidadas y funcionó perfectamente. Sólo sigue el formato de la línea de comandos.

También hay una forma de descomprimir los archivos a través de la línea de comandos que encontré también. Una manera, sólo abre una ventana de 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. ¿Tiene Windows 7 unzip en la línea de comandos instalada por defecto? https://stackoverflow.com/questions/1021557/how-to-unzip-a-file-using-the-command-line

1
1
1
2017-08-16 06:41:05 +0000

Esta es una vieja pregunta, pero su relevancia sigue siendo actual.

Windows, por supuesto, tiene su propio algoritmo de compresión incorporado para el uso de archivos zip, pero, realmente funciona mal cuando se compara 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 incorporadas de Windows, mi solución requiere la instalación de software adicional.

7Zip soporta un amplio rango de archivos, incluyendo ZIP, RAR, CAB e ISO y su propio formato 7z.

Puedes ver la ayuda de la línea de comandos: “C:\N-Archivos de Programa\N-7-Zip7z.exe” –ayuda

para realizar una simple adición al archivo zip:

“C:\N-Archivos de Programa\N-7-Zip7z.exe” un nombre de archivo.zip c:\N-ruta

1
1
1
2015-01-07 14:22:03 +0000

Voy a publicar algo relacionado con WSkids respuesta ya que tristemente no puedo usar la función de comentarios.

Usar el método CopyHere() en VBS introduce varios problemas. Uno de estos problemas es que el método regresa inmediatamente mientras que el proceso de copia se inicia en segundo plano, mientras que múltiples llamadas a CopyHere() interferirán entre sí y el ZIP no se creará correctamente. Se necesita un bucle de espera aquí para arreglar eso. Mi bucle de espera se basa en una respuesta a un problema similar publicado aquí .

Aquí hay una versión actualizada que corrige el error “Object required” reportado por pihentagy . Es un problema de tiempo ya que el archivo ZIP recién creado se incluye en la colección de elementos 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
1
1
1
2015-01-22 12:27:53 +0000

Aquí está mi intento de resumir las capacidades incorporadas de las ventanas para la compresión y la descompresión - https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders-with-batch-f

con algunas soluciones dadas que deberían funcionar en casi todas las máquinas de Windows.