2017-07-08 3 views
1

J'écris un VBScript pour essayer de compresser plusieurs répertoires dans différents endroits dans le même fichier Zip. La solution que j'utilise actuellement consiste à parcourir les répertoires que je veux compresser (dont il y en a actuellement 2), obtenir les objets du fichier et utiliser la méthode copyHere pour copier le dossier source dans un fichier zip avec le bon format d'en-tête.Comment puis-je être sûr qu'un très gros fichier compressé est fini de compresser?

Cette partie semble fonctionner, la difficulté que j'ai est avec la vérification d'erreur. Les deux seules solutions que j'ai trouvées en ligne sont d'obtenir le nombre d'objets dans les répertoires source et cible et de dormir jusqu'à ce qu'ils soient identiques, ou de vérifier si le fichier zip est ouvert pour l'ajout et le sommeil jusqu'à ce qu'il le soit. La première option est facile avec un répertoire, mais devient beaucoup plus fastidieuse avec plusieurs dossiers, sans compter que Windows va probablement créer un objet dans le répertoire cible avant qu'il ait fini de copier et je compresse des fichiers potentiellement plus de 10 Go donc cette solution ne fonctionnera pas.

J'avais essayé d'implémenter la deuxième solution mais chaque fois que la boucle arrivait au second appel à CopyHere, cela me disait que le fichier zip était corrompu à partir de la première itération. Est-il impossible de compresser des fichiers très volumineux dans un fichier zip avec VBScript? Toutes les autres suggestions sur la façon dont je peux vérifier que la compression est effectuée à l'aide de VBScript seraient très utiles.

+0

Il y a des problèmes documentés avec des tailles zip au-dessus de 2 Go/4 Go au moins [ici] (http://stackoverflow.com/questions/20009033/is-there-a-size-limit-for-a- zip-fichier-using-copyhere-in-vbscript) et [ici] (https://stackoverflow.com/questions/37411326/limiting-zip-file-size) – LotPings

Répondre

1

Voici un Function Create_WinRar_Archive(Source,Target_Archive,Password) pour compresser un dossier avec rar.exe la ligne de commande de Winrar. Nous pouvons appeler cette fonction de deux façons:

Si vous souhaitez créer une archive sans mot de passe, donc nous avons appelé de cette façon:

Call Create_WinRar_Archive(Source,Target_Archive,"")

ou si vous souhaitez définir à cela une archive mot de passe que nous avons appelé comme:

Call Create_WinRar_Archive(Source,Target_Archive,Password)

Et voici un exemple pour compresser le dossier Photos

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 
'****************************************************************************************************