Pergunta

É a compressão ZIP que está incorporada no Windows XP/Vista/2003/2008 capaz de ser programado em tudo?O que o executável eu teria que chamar de um MORCEGO/arquivo CMD?ou é possível fazê-lo com o VBScript?

Eu percebo que isso é possível usando WinZip, 7-Zip e outras aplicações externas, mas eu estou procurando por algo que não requer aplicações externas para ser instalado.

Foi útil?

Solução

Existem métodos para VBA zip e descompacte usando o windows construído em compressão, o que deve dar uma ideia de como o sistema funciona.Você pode ser capaz de construir um desses métodos em uma linguagem de script de sua escolha.

O princípio básico é que no windows você pode tratar um arquivo zip como um diretório e copie para dentro e para fora dele.Então, para criar um novo arquivo zip, basta criar um arquivo com a extensão .zip que tem o direito de cabeçalho para um vazio arquivo zip.Em seguida, você fechá-lo, e dizer o windows que você deseja copiar arquivos para ele como se ele fosse de outro diretório.

A descompactação é mais fácil - basta tratá-lo como um diretório.

No caso de páginas da web são perdidos de novo, aqui estão alguns dos relevantes trechos de código:

ZIP

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

DESCOMPACTE

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

Outras dicas

Sim, este pode ser programado com o VBScript.Por exemplo, o código a seguir pode criar um zip a partir de um diretório:

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

Você também pode encontrar http://www.naterice.com/blog/template_permalink.asp?id=64 útil na medida em que inclui um completo Descompacte/Zip implementação em VBScript.

Se você fizer uma verificação de tamanho a cada 500 ms, ao invés de incluir uma contagem de item que ele funciona melhor para arquivos grandes.Win 7, grava o arquivo instantaneamente embora não terminado de compactação:

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

Funciona muito bem para grandes quantidades de arquivos de log.

Apenas para esclarecimento:O GZip não é um MS-apenas algoritmo, como sugerido por Guy Starbuck, em seu comentário, a partir de agosto.O GZipStream no Sistema.IO.Compressão utiliza o algoritmo Deflate, da mesma forma como a biblioteca zlib, e muitas outras ferramentas de zip.Essa classe é totalmente interoperável com os utilitários do unix, como o gzip.

A classe GZipStream não é programável por scripts a partir da linha de comandos ou VBScript, para produzir arquivos ZIP, então ele sozinho não seria uma resposta o poster original do pedido.

Livre DotNetZip biblioteca de ler e produzir arquivos zip, e pode ser programado a partir do VBScript ou Powershell.Ele também inclui ferramentas de linha de comando para produzir e ler/extrair arquivos zip.

Veja aqui algumas código 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.")

Aqui está um código para o 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");

Em uma .ou bastão .arquivo cmd, você pode usar o zipit.exe ou unzip.exe as ferramentas.Por exemplo:

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

Aqui a minha tentativa de resumir construído em recursos do windows para compressão e descompressão - Como posso compactar (zip ) e descomprimir (/ descompactar arquivos e pastas com o arquivo em lotes sem uso de ferramentas externas?

com alguns dada soluções que deve funcionar em quase todos máquina windows.

No que se refere à shell.aplicação e o WSH eu preferia o jscript como ele permite que um híbrido de lote/arquivo jscript (com .bastão de extensão) que não necessitam de arquivos temporários.Eu coloquei descompacte o zip e capacidades em um arquivo além de mais alguns recursos.

Há tanto zip e descompacte os arquivos executáveis (bem como um barco carregado de outras aplicações úteis) no UnxUtils pacote disponível no SourceForge (http://sourceforge.net/projects/unxutils).Copie-os para um local no seu CAMINHO, como 'c:\windows' e você será capaz de incluí-los em seus scripts.

Esta não é a solução perfeita (ou o que você pediu), mas um trabalho digno de um todo.

para criar um arquivo compactado, você pode usar o utilitário MAKECAB.EXE

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top