Extraiga archivos del archivo ZIP con VBScript
(5)
Puede usar DotNetZip desde VBScript.
Para descomprimir un archivo zip existente, sobrescribiendo todos 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 archivo zip nuevo:
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.")
Al extraer archivos de un archivo ZIP, estaba usando lo siguiente.
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 error "El archivo existe".
¿Cuál es la razón para esto? ¿Hay alguna alternativa?
http://www.experts-exchange.com/Programming/Languages/Visual_Basic/VB_Script/Q_23022290.html
Verifica tu directorio temporal. Si tiene 99 carpetas asociadas con este proceso de descompresión, intente eliminarlas.
Hay respuestas arriba que son perfectamente correctas, pero pensé en 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 )
Todas las soluciones anteriores 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 dentro de su archivo zip, que está tratando de extraer.
Así es, si tiene 50 archivos, creará 50 carpetas dentro de su directorio temporal.
PERO si tiene 200 archivos, se detendrá en 99 y se bloqueará - El archivo existe
..
Aparentemente esto no ocurre en Windows 7, con las contribuciones que veo arriba. 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, copie y pegue esas dos funciones en su programa alojado de vbscript y estará listo, en Windows XP y Windows 7.
¡Gracias!
Agregué el siguiente código al comienzo 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