Pregunta

¿Se puede programar la compresión ZIP integrada en Windows XP/Vista/2003/2008?¿Qué ejecutable tendría que llamar desde un archivo BAT/CMD?¿O es posible hacerlo con VBScript?

Me doy cuenta de que esto es posible usando WinZip, 7 cremalleras y otras aplicaciones externas, pero estoy buscando algo que no requiera la instalación de aplicaciones externas.

¿Fue útil?

Solución

Hay métodos VBA para cremallera y abrir la cremallera utilizando también las ventanas integradas en compresión, lo que debería dar una idea de cómo funciona el sistema.Es posible que pueda integrar estos métodos en un lenguaje de programación de su elección.

El principio básico es que dentro de Windows puede tratar un archivo zip como un directorio y copiarlo dentro y fuera de él.Entonces, para crear un nuevo archivo zip, simplemente crea un archivo con la extensión .zip que tiene el encabezado correcto para un archivo zip vacío.Luego lo cierra y le dice a Windows que desea copiar archivos en él como si fuera otro directorio.

Descomprimirlo es más fácil: trátelo como un directorio.

En caso de que las páginas web se pierdan nuevamente, estos son algunos de los fragmentos de código relevantes:

CREMALLERA

Sub NewZip(sPath)
'Create empty Zip File
'Changed by keepITcool Dec-12-2005
    If Len(Dir(sPath)) > 0 Then Kill sPath
    Open sPath For Output As #1
    Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0)
    Close #1
End Sub


Function bIsBookOpen(ByRef szBookName As String) As Boolean
' Rob Bovey
    On Error Resume Next
    bIsBookOpen = Not (Application.Workbooks(szBookName) Is Nothing)
End Function


Function Split97(sStr As Variant, sdelim As String) As Variant
'Tom Ogilvy
    Split97 = Evaluate("{""" & _
                       Application.Substitute(sStr, sdelim, """,""") & """}")
End Function

Sub Zip_File_Or_Files()
    Dim strDate As String, DefPath As String, sFName As String
    Dim oApp As Object, iCtr As Long, I As Integer
    Dim FName, vArr, FileNameZip

    DefPath = Application.DefaultFilePath
    If Right(DefPath, 1) <> "\" Then
        DefPath = DefPath & "\"
    End If

    strDate = Format(Now, " dd-mmm-yy h-mm-ss")
    FileNameZip = DefPath & "MyFilesZip " & strDate & ".zip"

    'Browse to the file(s), use the Ctrl key to select more files
    FName = Application.GetOpenFilename(filefilter:="Excel Files (*.xl*), *.xl*", _
                    MultiSelect:=True, Title:="Select the files you want to zip")
    If IsArray(FName) = False Then
        'do nothing
    Else
        'Create empty Zip File
        NewZip (FileNameZip)
        Set oApp = CreateObject("Shell.Application")
        I = 0
        For iCtr = LBound(FName) To UBound(FName)
            vArr = Split97(FName(iCtr), "\")
            sFName = vArr(UBound(vArr))
            If bIsBookOpen(sFName) Then
                MsgBox "You can't zip a file that is open!" & vbLf & _
                       "Please close it and try again: " & FName(iCtr)
            Else
                'Copy the file to the compressed folder
                I = I + 1
                oApp.Namespace(FileNameZip).CopyHere FName(iCtr)

                'Keep script waiting until Compressing is done
                On Error Resume Next
                Do Until oApp.Namespace(FileNameZip).items.Count = I
                    Application.Wait (Now + TimeValue("0:00:01"))
                Loop
                On Error GoTo 0
            End If
        Next iCtr

        MsgBox "You find the zipfile here: " & FileNameZip
    End If
End Sub

ABRIR LA CREMALLERA

Sub Unzip1()
    Dim FSO As Object
    Dim oApp As Object
    Dim Fname As Variant
    Dim FileNameFolder As Variant
    Dim DefPath As String
    Dim strDate As String

    Fname = Application.GetOpenFilename(filefilter:="Zip Files (*.zip), *.zip", _
                                        MultiSelect:=False)
    If Fname = False Then
        'Do nothing
    Else
        'Root folder for the new folder.
        'You can also use DefPath = "C:\Users\Ron\test\"
        DefPath = Application.DefaultFilePath
        If Right(DefPath, 1) <> "\" Then
            DefPath = DefPath & "\"
        End If

        'Create the folder name
        strDate = Format(Now, " dd-mm-yy h-mm-ss")
        FileNameFolder = DefPath & "MyUnzipFolder " & strDate & "\"

        'Make the normal folder in DefPath
        MkDir FileNameFolder

        'Extract the files into the newly created folder
        Set oApp = CreateObject("Shell.Application")

        oApp.Namespace(FileNameFolder).CopyHere oApp.Namespace(Fname).items

        'If you want to extract only one file you can use this:
        'oApp.Namespace(FileNameFolder).CopyHere _
         'oApp.Namespace(Fname).items.Item("test.txt")

        MsgBox "You find the files here: " & FileNameFolder

        On Error Resume Next
        Set FSO = CreateObject("scripting.filesystemobject")
        FSO.deletefolder Environ("Temp") & "\Temporary Directory*", True
    End If
End Sub

Otros consejos

Sí, esto se puede programar con VBScript.Por ejemplo, el siguiente código puede crear un zip desde un directorio:

Dim fso, winShell, MyTarget, MySource, file
Set fso = CreateObject("Scripting.FileSystemObject")
Set winShell = createObject("shell.application")


MyTarget = Wscript.Arguments.Item(0)
MySource = Wscript.Arguments.Item(1)

Wscript.Echo "Adding " & MySource & " to " & MyTarget

'create a new clean zip archive
Set file = fso.CreateTextFile(MyTarget, True)
file.write("PK" & chr(5) & chr(6) & string(18,chr(0)))
file.close

winShell.NameSpace(MyTarget).CopyHere winShell.NameSpace(MySource).Items

do until winShell.namespace(MyTarget).items.count = winShell.namespace(MySource).items.count
    wscript.sleep 1000 
loop

Set winShell = Nothing
Set fso = Nothing

También puedes encontrar http://www.naterice.com/blog/template_permalink.asp?id=64 útil ya que incluye una implementación completa de Unzip/Zip en VBScript.

Si realiza una verificación de tamaño cada 500 ms en lugar de un recuento de elementos, funcionará mejor para archivos grandes.Win 7 escribe el archivo instantáneamente aunque no ha terminado de comprimir:

set fso=createobject("scripting.filesystemobject")
Set h=fso.getFile(DestZip)
do
    wscript.sleep 500
    max = h.size
loop while h.size > max 

Funciona muy bien para grandes cantidades de archivos de registro.

Sólo para mayor claridad:GZip no es un algoritmo exclusivo de MS como sugirió Guy Starbuck en su comentario de agosto.GZipStream en System.IO.Compression utiliza el algoritmo Deflate, igual que la biblioteca zlib y muchas otras herramientas zip.Esa clase es totalmente interoperable con utilidades de Unix como gzip.

La clase GZipStream no se puede programar desde la línea de comandos o VBScript para producir archivos ZIP, por lo que por sí sola no sería una respuesta a la solicitud del autor original.

el libre DotNetZip La biblioteca lee y produce archivos zip y se puede programar desde VBScript o Powershell.También incluye herramientas de línea de comandos para producir y leer/extraer archivos zip.

Aquí hay un código para VBScript:

dim filename 
filename = "C:\temp\ZipFile-created-from-VBScript.zip"

WScript.echo("Instantiating a ZipFile object...")
dim zip 
set zip = CreateObject("Ionic.Zip.ZipFile")

WScript.echo("using AES256 encryption...")
zip.Encryption = 3

WScript.echo("setting the password...")
zip.Password = "Very.Secret.Password!"

WScript.echo("adding a selection of files...")
zip.AddSelectedFiles("*.js")
zip.AddSelectedFiles("*.vbs")

WScript.echo("setting the save name...")
zip.Name = filename

WScript.echo("Saving...")
zip.Save()

WScript.echo("Disposing...")
zip.Dispose()

WScript.echo("Done.")

Aquí hay un código para Powershell:

[System.Reflection.Assembly]::LoadFrom("c:\\dinoch\\bin\\Ionic.Zip.dll");

$directoryToZip = "c:\\temp";
$zipfile =  new-object Ionic.Zip.ZipFile;
$e= $zipfile.AddEntry("Readme.txt", "This is a zipfile created from within powershell.")
$e= $zipfile.AddDirectory($directoryToZip, "home")
$zipfile.Save("ZipFiles.ps1.out.zip");

En un archivo .bat o .cmd, puede utilizar las herramientas zipit.exe o unzip.exe.P.ej:

zipit NewZip.zip  -s "This is string content for an entry"  Readme.txt  src 

Aquí está mi intento de resumir las ventanas de capacidades integradas para compresión y descompresión: ¿Cómo puedo comprimir (/ zip ) y descomprimir (/ unzip ) archivos y carpetas con archivos por lotes sin utilizar herramientas externas?

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

En lo que respecta a la aplicación.shell y WSH preferí el jscriptya que permite un archivo híbrido por lotes/jscript (con extensión .bat) que no requiere archivos temporales. He puesto capacidades de descomprimir y comprimir en un archivo además de algunas funciones más.

Hay ejecutables zip y descomprimir (así como una gran cantidad de otras aplicaciones útiles) en el paquete UnxUtils disponible en SourceForge (http://sourceforge.net/projects/unxutils).Cópielos en una ubicación en su RUTA, como 'c:\windows', y podrá incluirlos en sus scripts.

Esta no es la solución perfecta (o la que usted solicitó), sino una solución alternativa decente.

para crear un archivo comprimido puede utilizar la utilidad MAKECAB.EXE

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top