2008-11-14 23 views
10

Durante l'estrazione di file da un file ZIP stavo usando quanto segue.Estrai file da file ZIP con 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 

Questo funzionava, ma ora si verifica un errore "Il file esiste".

Qual è il motivo? Ci sono alternative?

+0

@ Tester101 Contrassegna una delle risposte come risposta o rispondi autonomamente. Grazie –

risposta

2

ho aggiunto il seguente codice per l'inizio della mia procedura di decompressione per eliminare queste directory prima di decomprimere:

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

È possibile utilizzare DotNetZip da VBScript.

per spacchettare un file zip esistente, sovrascrivendo i file che possono esistere:

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.") 

Per creare un nuovo file 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

C'è risposte sopra che sono perfettamente corrette, ma ho pensato che' d avvolgere tutto in una soluzione completa che sto usando:

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

Tutto sopra sol le utenze sono accurate ma non definitive.

Se si sta tentando di estrarre un file con zip in una cartella temporanea, verrà immediatamente creata una cartella che visualizza "Cartella temporanea per YOURFILE.zip" (in C: \ Documents and Settings \ USERNAME \ Impostazioni locali \ Temp) per CIASCUN FILE contenuto nel file zip, che si sta tentando di estrarre.

Esatto, se si dispone di 50 file, verranno create 50 cartelle all'interno della directory temporanea.

ma se avete 200 file, esso si fermerà a 99 e crash affermando - il file esiste

..

A quanto pare questo non si verifica in Windows 7, con i contributi ho vista sopra . Ma a prescindere, possiamo ancora avere degli assegni. Bene, questo è come lo aggiusti.

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

E questo è tutto, copiare e incollare le due funzioni nel vostro programma VBScript ospitato e si dovrebbe essere pronti per partire, su Windows XP & Windows 7.

Grazie!

+1

bel codice per la pulizia; Grazie! fso.GetSpecialFolder (TemporaryFolder) sarà ancora più bello :) – Juliusz

+0

Ho avuto un sacco di problemi con questo fino a quando ho iniziato a utilizzare percorsi completi e assoluti. ". \ zipfile.zip" non ha funzionato affatto per me. – sirdank