Frage

Kann die in Windows XP/Vista/2003/2008 integrierte ZIP-Komprimierung überhaupt per Skript ausgeführt werden?Welche ausführbare Datei müsste ich aus einer BAT/CMD-Datei aufrufen?oder ist das mit VBScript möglich?

Mir ist klar, dass dies mit möglich ist WinZip, 7-Reißverschluss und andere externe Anwendungen, aber ich suche nach etwas, das keine Installation externer Anwendungen erfordert.

War es hilfreich?

Lösung

Dafür gibt es VBA-Methoden Reißverschluss Und entpacken Verwenden Sie auch die in Windows integrierten Komprimierungsfunktionen, die einen Einblick in die Funktionsweise des Systems geben sollten.Möglicherweise können Sie diese Methoden in eine Skriptsprache Ihrer Wahl integrieren.

Das Grundprinzip besteht darin, dass Sie in Windows eine ZIP-Datei als Verzeichnis behandeln und hinein- und herauskopieren können.Um also eine neue ZIP-Datei zu erstellen, erstellen Sie einfach eine Datei mit der Erweiterung .zip das hat den richtigen Header für eine leere ZIP-Datei.Dann schließen Sie es und teilen Windows mit, dass Sie Dateien hineinkopieren möchten, als wäre es ein anderes Verzeichnis.

Das Entpacken ist einfacher – behandeln Sie es einfach wie ein Verzeichnis.

Für den Fall, dass die Webseiten erneut verloren gehen, finden Sie hier einige der relevanten Codeausschnitte:

REISSVERSCHLUSS

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

ENTPACKEN

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

Andere Tipps

Ja, dies kann mit VBScript geschrieben werden.Mit dem folgenden Code kann beispielsweise eine ZIP-Datei aus einem Verzeichnis erstellt werden:

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

Möglicherweise finden Sie auch http://www.naterice.com/blog/template_permalink.asp?id=64 hilfreich, da es eine vollständige Unzip/Zip-Implementierung in VBScript enthält.

Wenn Sie alle 500 ms eine Größenprüfung statt einer Elementzählung durchführen, funktioniert dies bei großen Dateien besser.Win 7 schreibt die Datei sofort, obwohl die Komprimierung noch nicht abgeschlossen ist:

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

Funktioniert hervorragend für große Mengen an Protokolldateien.

Nur zur Klarheit:GZip ist kein reiner MS-Algorithmus, wie Guy Starbuck in seinem Kommentar vom August andeutete.Der GZipStream in System.IO.Compression verwendet den Deflate-Algorithmus, genau wie die zlib-Bibliothek und viele andere Zip-Tools.Diese Klasse ist vollständig mit Unix-Dienstprogrammen wie gzip kompatibel.

Die GZipStream-Klasse ist nicht über die Befehlszeile oder VBScript skriptfähig, um ZIP-Dateien zu erstellen, daher wäre sie allein keine Antwort auf die Anfrage des ursprünglichen Autors.

Die Freiheit DotNetZip Die Bibliothek liest und erstellt ZIP-Dateien und kann über VBScript oder Powershell als Skript erstellt werden.Es enthält auch Befehlszeilentools zum Erstellen und Lesen/Extrahieren von ZIP-Dateien.

Hier ist ein Code für 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.")

Hier ist ein Code für 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 einer .bat- oder .cmd-Datei können Sie die Tools zipit.exe oder unzip.exe verwenden.Z.B:

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

Hier ist mein Versuch, die integrierten Funktionsfenster für die Komprimierung und Dekomprimierung zusammenzufassen: Wie kann ich Dateien und Ordner mit einer Batch-Datei komprimieren (/zip) und dekomprimieren (/unzip), ohne externe Tools zu verwenden?

mit ein paar vorgegebenen Lösungen, die auf fast jedem Windows-Rechner funktionieren sollten.

Was die betrifft Shell.Anwendung und WSH Ich bevorzuge das jscriptda es eine hybride Batch-/JScript-Datei (mit der Erweiterung .bat) ermöglicht, für die keine temporären Dateien erforderlich sind. Ich habe Entpack- und Zip-Funktionen in einer Datei sowie ein paar weitere Funktionen zusammengefasst.

Das auf SourceForge verfügbare UnxUtils-Paket enthält ausführbare Zip- und Unzip-Dateien (sowie eine Menge anderer nützlicher Anwendungen) (http://sourceforge.net/projects/unxutils).Kopieren Sie sie an einen Speicherort in Ihrem PATH, z. B. „c:\windows“, und Sie können sie in Ihre Skripte einbinden.

Dies ist nicht die perfekte Lösung (oder die, nach der Sie gefragt haben), sondern eine anständige Lösung.

Um ein komprimiertes Archiv zu erstellen, können Sie das Dienstprogramm MAKECAB.EXE verwenden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top