2008-11-14 49 views
10

Al extraer archivos de un archivo ZIP estaba usando lo siguiente.Extraiga archivos del archivo 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 

Esto funcionaba, pero ahora aparece el mensaje "El archivo existe".

¿Cuál es el motivo de esto? ¿Hay alguna alternativa?

+0

@ Tester101 Marque una de las respuestas como respuesta o respóndala usted mismo. Gracias –

Respuesta

2

I añade el siguiente código al principio de mi procedimiento de descompresión para eliminar estos directorios antes de descomprimir:

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

Usted puede utilizar DotNetZip desde VBScript.

Para descomprimir un archivo zip existente, sobrescribiendo los archivos que puedan existir:

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

Para crear un nuevo archivo 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

Hay respuestas anteriores que son perfectamente correcto, pero pensé' d envolver todo en una solución completa que estoy 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

Todo lo anterior son precisas, pero no son definitivas.

Si está intentando extraer un archivo comprimido en una carpeta temporal, se creará inmediatamente una carpeta que muestre "Carpeta temporal para YOURFILE.zip" (en C: \ Documents and Settings \ NOMBRE DE USUARIO \ Configuración local \ Temp) para CADA ARCHIVO contenido en su archivo zip, que está tratando de extraer.

Así es, si tiene 50 archivos, creará 50 carpetas dentro de su directorio temporal.

pero si usted tiene 200 archivos, se detendrá a los 99 y accidente indicando - El archivo existe

..

Al parecer, esto no ocurre en Windows 7, con las contribuciones veo por encima de . Pero independientemente, aún podemos tener controles. De acuerdo, así es como lo arreglas.

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

Y eso es todo, copiar y pegar esas dos funciones en su programa de VBScript alojado y que debe ser bueno para ir, en Windows XP & Windows 7.

Gracias!

+1

buen código para limpiar; ¡Gracias! fso.GetSpecialFolder (TemporaryFolder) será aún mejor :) – Juliusz

+0

Tuve muchos problemas con esto hasta que comencé a usar rutas completas y absolutas. ". \ zipfile.zip" no funcionó en absoluto para mí. – sirdank

Cuestiones relacionadas