2017-07-08 3 views
1

Ich schreibe ein VBScript, um zu versuchen, mehrere Verzeichnisse an verschiedenen Orten in derselben Zip-Datei zu komprimieren.Wie kann ich sicher sein, dass eine sehr große Zip-Datei komprimiert ist?

Die aktuelle Lösung, die ich verwende, besteht darin, über die Verzeichnisse zu iterieren, von denen es derzeit 2 gibt, die Dateiobjekte zu erhalten und die copyHere-Methode zu verwenden, um den Quellordner in eine ZIP-Datei zu kopieren Header-Format.

Dieser Teil scheint in Ordnung zu sein, die Schwierigkeit, die ich habe, ist mit der Fehlerprüfung. Die einzigen beiden Lösungen, die ich online gefunden habe, sind die Anzahl der Objekte in den Quell- und Zielverzeichnissen und das Einschlafen, bis sie gleich sind, oder um zu prüfen, ob die Zip-Datei zum Anhängen und Schlafen geöffnet ist.

Die erste Option ist einfach mit einem Verzeichnis, wird aber viel mühsamer mit mehreren Ordnern, ganz zu schweigen davon, dass Windows wahrscheinlich ein Objekt im Zielverzeichnis erstellt, bevor es mit dem Kopieren fertig ist und ich Dateien über 10 GB komprimiere Diese Lösung wird nicht funktionieren.

Ich hatte versucht, die zweite Lösung zu implementieren, aber jedes Mal, wenn die Schleife zum zweiten Aufruf von CopyHere kam, würde es mir sagen, dass die Zip-Datei von der ersten Iteration an beschädigt war. Ist es nicht möglich, sehr große Dateien mit VBScript zu komprimieren?

Alle anderen Vorschläge, wie ich Fehler überprüfen kann, dass die Komprimierung mit VBScript getan wird, wäre sehr hilfreich.

+0

Es gibt Probleme dokumentiert mit Reißverschluss Größen über 2GB/4GB mindestens [hier] (http://stackoverflow.com/questions/20009033/is-there-a-size-limit-for-a- zip-file-using-copyhere-in-vbscript) und [hier] (https://stackoverflow.com/questions/37411326/limiting-zip-file-size) – LotPings

Antwort

1

Hier ist ein Function Create_WinRar_Archive(Source,Target_Archive,Password) zum Komprimieren eines Ordners mit rar.exe Befehlszeile von Winrar. Wir können diese Funktion durch zwei Arten aufrufen:

Wenn Sie ein Archiv ohne Passwort erstellen möchten, so nannten wir es auf diese Weise:

Call Create_WinRar_Archive(Source,Target_Archive,"")

oder wenn Sie wollen dieses Archivs ein setzen Kennwort nur nannten wir es als:

Call Create_WinRar_Archive(Source,Target_Archive,Password)

Und hier ist ein Beispiel für die Ordner Bilder zu komprimieren

Option Explicit 
Dim ws,Source,Target_Archive,Password 
Set ws = CreateObject("Wscript.Shell") 
Source = ws.ExpandEnvironmentStrings("%userprofile%\pictures") 
Target_Archive = "C:\BackupImages.rar" 
Password = "123456" 
Call Create_WinRar_Archive(Source,Target_Archive,Password) 
Wscript.echo "All files are archived successfully !" 
ws.run "Explorer " & Target_Archive 
'****************************************************************************************************** 
Function Create_WinRar_Archive(Source,Target_Archive,Password) 
'This function executes the command line 
'version of WinRAR and reports whether 
'the archive exists after WinRar exits. 
'If it exists then it returns true. If 
'not it returns an error message. 
'------------------------------------------------------------------------------------ 
    Dim oFSO,oShell,aScriptFilename,sScriptFilename 
    Dim sWorkingDirectory,ProgramFiles,sWinRarLocation 
    Set oFSO = CreateObject("Scripting.FileSystemObject") 
    Set oShell = CreateObject("Wscript.Shell") 
'--------Find Working Directory-------- 
    aScriptFilename = Split(Wscript.ScriptFullName, "\") 
    sScriptFilename = aScriptFileName(Ubound(aScriptFilename)) 
    sWorkingDirectory = Replace(Wscript.ScriptFullName, sScriptFilename, "") 
'-------Ensure we can find Winrar.exe------ 
If oFSO.FileExists(sWorkingDirectory & " " & "Winrar.EXE") Then 
    sWinRarLocation = "" 
    ElseIf oFSO.FileExists(oShell.ExpandEnvironmentStrings("%ProgramFiles%\Winrar\rar.exe")) Then 
     sWinRarLocation = oShell.ExpandEnvironmentStrings("%programfiles%\Winrar\") 
    ElseIf oFSO.FileExists(oShell.ExpandEnvironmentStrings("%ProgramFiles(x86)%\Winrar\rar.exe")) Then 
     sWinRarLocation = oShell.ExpandEnvironmentStrings("%programfiles(x86)%\Winrar\") 
    Else 
    Create_WinRar_Archive = "Error: Couldn't find Winrar.EXE" 
    Exit Function 
    End If 
    '-------------------------------------- 
'The Command "A" Means ==> add to archive 
'To create a WinRar file with the specified name after command A (archive) and the switches -ep1 (exclude base directory from names) and -r (recursive) 
    If Password = "" Then 
     oShell.Run """" & sWinRarLocation & "rar.exe"" A -ep1 -r """ & _ 
     Target_Archive & """ """ & Source & """",0,True 
    Else 
'The -hp<password> switch: To use a password 
     oShell.Run """" & sWinRarLocation & "rar.exe"" A -ep1 -r -hp"&Password&" """ & _ 
     Target_Archive & """ """ & Source & """",0,True 
    End If 
    If oFSO.FileExists(Target_Archive) Then 
     Create_WinRar_Archive = 1 
    Else 
     Create_WinRar_Archive = "Error: Creating archives failed !" 
     MsgBox Create_WinRar_Archive,16,Create_WinRar_Archive 
    End If 
End Function 
'**************************************************************************************************** 
Verwandte Themen