vbscript zip

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?



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