2008-11-14 6 views
10

Lors de l'extraction de fichiers à partir d'un fichier ZIP, j'ai utilisé ce qui suit.Extraire des fichiers du fichier ZIP avec VBScript

Sub Unzip(strFile) 
' This routine unzips a file. NOTE: The files are extracted to a folder ' 
' in the same location using the name of the file minus the extension. ' 
' EX. C:\Test.zip will be extracted to C:\Test ' 
'strFile (String) = Full path and filename of the file to be unzipped. ' 
Dim arrFile 
    arrFile = Split(strFile, ".") 
    Set fso = CreateObject("Scripting.FileSystemObject") 
    fso.CreateFolder(arrFile(0) & "\ ") 
    pathToZipFile= arrFile(0) & ".zip" 
    extractTo= arrFile(0) & "\ " 
    set objShell = CreateObject("Shell.Application") 
    set filesInzip=objShell.NameSpace(pathToZipFile).items 
    objShell.NameSpace(extractTo).CopyHere(filesInzip) 
    fso.DeleteFile pathToZipFile, True 
    Set fso = Nothing 
    Set objShell = Nothing 
End Sub 'Unzip 

Cela a fonctionné, mais maintenant je reçois un "The File Exists" Error.

Pour quelle raison? Y a-t-il des alternatives?

+0

@ Tester101 Veuillez cocher l'une des réponses en réponse ou répondre vous-même. Merci –

Répondre

2

j'ai ajouté le code suivant au début de ma procédure Décompressez supprimer ces répertoires avant de dézipper:

For i = 1 To 99 
    If aqFileSystem.Exists(GetAppPath("Local Settings", "") & "\Temp\Temporary Directory " & i & " for DialogState.zip") = True Then 
     result = aqFileSystem.ChangeAttributes(GetAppPath("Local Settings", "") & "\Temp\Temporary Directory " & i & " for DialogState.zip", 1 OR 2, aqFileSystem.fattrFree) 
     Call DelFolder(GetAppPath("Local Settings", "") & "\Temp\Temporary Directory " & i & " for DialogState.zip") 
    Else 
     Exit For 
    End If 
Next 
4

Vous pouvez utiliser DotNetZip de VBScript.

Pour déballer un fichier zip existant, en écrasant tous les fichiers qui peuvent exister:

WScript.echo("Instantiating a ZipFile object...") 
Dim zip 
Set zip = CreateObject("Ionic.Zip.ZipFile") 

WScript.echo("Initialize (Read)...") 
zip.Initialize("C:\Temp\ZipFile-created-from-VBScript.zip") 

WScript.echo("setting the password for extraction...") 
zip.Password = "This is the Password." 

' set the default action for extracting an existing file 
' 0 = throw exception 
' 1 = overwrite silently 
' 2 = don't overwrite (silently) 
' 3 = invoke the ExtractProgress event 
zip.ExtractExistingFile = 1 

WScript.echo("extracting all files...") 
Call zip.ExtractAll("extract") 

WScript.echo("Disposing...") 
zip.Dispose() 

WScript.echo("Done.") 

Pour créer un nouveau fichier zip:

dim filename 
filename = "C:\temp\ZipFile-created-from-VBScript.zip" 

WScript.echo("Instantiating a ZipFile object...") 
dim zip2 
set zip2 = CreateObject("Ionic.Zip.ZipFile") 

WScript.echo("using AES256 encryption...") 
zip2.Encryption = 3 

WScript.echo("setting the password...") 
zip2.Password = "This is the Password." 

WScript.echo("adding a selection of files...") 
zip2.AddSelectedFiles("*.js") 
zip2.AddSelectedFiles("*.vbs") 

WScript.echo("setting the save name...") 
zip2.Name = filename 

WScript.echo("Saving...") 
zip2.Save() 

WScript.echo("Disposing...") 
zip2.Dispose() 

WScript.echo("Done.") 
2

Il y a des réponses ci-dessus qui sont tout à fait correct, mais je pensais que je d envelopper tout dans une solution complète que j'utilise:

strZipFile = "test.zip"  'name of zip file 
outFolder = "."    'destination folder of unzipped files (must exist) 
'If using full paths rather than relative to the script, comment the next line 
pwd = Replace(WScript.ScriptFullName, WScript.ScriptName, "") 

Set objShell = CreateObject("Shell.Application") 
Set objSource = objShell.NameSpace(pwd+strZipFile).Items() 
Set objTarget = objShell.NameSpace(pwd+outFolder) 
intOptions = 256 
objTarget.CopyHere objSource, intOptions 

'Clean up 
Set WshShell = CreateObject("Wscript.Shell") 
tempfolder = WshShell.ExpandEnvironmentStrings("%temp%") 
Set fso = CreateObject("Scripting.FileSystemObject") 
Call fso.DeleteFolder(tempfolder + "\Temporary Directory 1 for " + strZipFile, True) 
8

Tout au-dessus sol Les réponses sont précises mais elles ne sont pas définitives.

Si vous essayez d'extraire un fichier zippé dans un dossier temporaire, un dossier qui affiche "Dossier temporaire pour YOURFILE.zip" sera immédiatement créé (dans C: \ Documents and Settings \ USERNAME \ Local Settings \ Temp) pour CHAQUE FICHIER contenu dans votre fichier zip, que vous essayez d'extraire.

C'est vrai, si vous avez 50 fichiers, il créera 50 dossiers dans votre répertoire temporaire.

mais si vous avez 200 fichiers, il arrêtera à 99 et accident indiquant - Le fichier Exists

..

Apparemment, cela ne se produit pas sur Windows 7, avec les contributions que je vue ci-dessus . Mais peu importe, nous pouvons toujours avoir des vérifications. D'accord, c'est ainsi que vous le corrigez.

'======================== 
    'Sub: UnzipFiles 
    'Language: vbscript 
    'Usage: UnzipFiles("C:\dir", "extract.zip") 
    'Definition: UnzipFiles([Directory where zip is located & where files will be extracted], [zip file name]) 
    '======================== 
    Sub UnzipFiles(folder, file) 
     Dim sa, filesInzip, zfile, fso, i : i = 1 
     Set sa = CreateObject("Shell.Application") 
      Set filesInzip=sa.NameSpace(folder&file).items 
     For Each zfile In filesInzip 
      If Not fso.FileExists(folder & zfile) Then 
       sa.NameSpace(folder).CopyHere(zfile), &H100 
       i = i + 1 
      End If 
      If i = 99 Then 
      zCleanup(file, i) 
      i = 1 
      End If 
     Next 
     If i > 1 Then 
      zCleanup(file, i) 
     End If 
     fso.DeleteFile(folder&file) 
    End Sub 

    '======================== 
    'Sub: zCleanup 
    'Language: vbscript 
    'Usage: zCleanup("filename.zip", 4) 
    'Definition: zCleanup([Filename of Zip previously extracted], [Number of files within zip container]) 
    '======================== 
    Sub zCleanUp(file, count) 
     'Clean up 
     Dim i, fso 
     Set fso = CreateObject("Scripting.FileSystemObject") 
     For i = 1 To count 
      If fso.FolderExists(fso.GetSpecialFolder(2) & "\Temporary Directory " & i & " for " & file) = True Then 
      text = fso.DeleteFolder(fso.GetSpecialFolder(2) & "\Temporary Directory " & i & " for " & file, True) 
      Else 
       Exit For 
      End If 
     Next 
    End Sub 

Et thats it, copiez et collez ces deux fonctions dans votre programme hébergé vbscript et vous devriez être bon d'aller, sous Windows XP & Windows 7.

Merci!

+1

joli code pour le nettoyage; Merci! fso.GetSpecialFolder (TemporaryFolder) sera encore plus agréable :) – Juliusz

+0

J'ai eu beaucoup de problèmes avec ça jusqu'à ce que je commence à utiliser des chemins absolus. "\ zipfile.zip" ne fonctionnait pas du tout pour moi. – sirdank

Questions connexes