Domanda

È possibile creare script per la compressione ZIP integrata in Windows XP/Vista/2003/2008?Quale eseguibile dovrei chiamare da un file BAT/CMD?o è possibile farlo con VBScript?

Mi rendo conto che questo è possibile utilizzando WinZip, 7-zip e altre applicazioni esterne, ma sto cercando qualcosa che non richieda l'installazione di applicazioni esterne.

È stato utile?

Soluzione

Esistono metodi VBA per cerniera lampo E decomprimere utilizzando anche le finestre integrate in compressione, che dovrebbero fornire alcune informazioni su come funziona il sistema.Potresti essere in grado di integrare questi metodi in un linguaggio di scripting di tua scelta.

Il principio di base è che all'interno di Windows è possibile trattare un file zip come una directory e copiarlo dentro e fuori da esso.Quindi, per creare un nuovo file zip, devi semplicemente creare un file con l'estensione .zip che abbia l'intestazione corretta per un file zip vuoto.Quindi lo chiudi e dici a Windows che vuoi copiare i file al suo interno come se fosse un'altra directory.

Decomprimerlo è più semplice: trattalo come una directory.

Nel caso in cui le pagine web vengano perse nuovamente, ecco alcuni frammenti di codice rilevanti:

cerniera lampo

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

DECOMPRIMERE

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

Altri suggerimenti

Sì, questo può essere scritto con VBScript.Ad esempio il seguente codice può creare un zip da una directory:

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

Potresti anche trovare http://www.naterice.com/blog/template_permalink.asp?id=64 utile in quanto include un'implementazione completa di Unzip/Zip in VBScript.

Se esegui un controllo delle dimensioni ogni 500 ms anziché un conteggio degli elementi, funzionerà meglio per file di grandi dimensioni.Win 7 scrive il file immediatamente anche se la compressione non è terminata:

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

Funziona alla grande per enormi quantità di file di registro.

Solo per chiarezza:GZip non è un algoritmo riservato a MS, come suggerito da Guy Starbuck nel suo commento di agosto.GZipStream in System.IO.Compression utilizza l'algoritmo Deflate, proprio come la libreria zlib e molti altri strumenti zip.Quella classe è completamente interoperabile con le utilità Unix come gzip.

La classe GZipStream non è scriptabile dalla riga di comando o da VBScript, per produrre file ZIP, quindi da sola non sarebbe una risposta alla richiesta dell'utente originale.

Il libero DotNetZip la libreria legge e produce file zip e può essere creata tramite script da VBScript o Powershell.Include anche strumenti da riga di comando per produrre e leggere/estrarre file zip.

Ecco del codice per 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.")

Ecco del codice per 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");

In un file .bat o .cmd è possibile utilizzare gli strumenti zipit.exe o unzip.exe.Per esempio:

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

Ecco il mio tentativo di riassumere le finestre delle funzionalità integrate per la compressione e la decompressione: Come posso comprimere (/zip) e decomprimere (/unzip) file e cartelle con file batch senza utilizzare strumenti esterni?

con alcune soluzioni fornite che dovrebbero funzionare su quasi tutte le macchine Windows.

Per quanto riguarda il shell.application e WSH ho preferito il jscriptpoiché consente un file ibrido batch/jscript (con estensione .bat) che non richiede file temporanei. Ho inserito le funzionalità di decompressione e zip in un unico file oltre ad alcune altre funzionalità.

Ci sono sia eseguibili zip che unzip (oltre a un sacco di altre applicazioni utili) nel pacchetto UnxUtils disponibile su SourceForge (http://sourceforge.net/projects/unxutils).Copiali in una posizione nel tuo PERCORSO, come "c:\windows", e sarai in grado di includerli nei tuoi script.

Questa non è la soluzione perfetta (o quella che hai richiesto) ma una soluzione decente.

per creare un archivio compresso è possibile utilizzare l'utility MAKECAB.EXE

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top