O Windows pode' built-in de compressão ZIP ser script?
-
09-06-2019 - |
Pergunta
É a compressão ZIP que está incorporada no Windows XP/Vista/2003/2008 capaz de ser programado em tudo?O que o executável eu teria que chamar de um MORCEGO/arquivo CMD?ou é possível fazê-lo com o VBScript?
Eu percebo que isso é possível usando WinZip, 7-Zip e outras aplicações externas, mas eu estou procurando por algo que não requer aplicações externas para ser instalado.
Solução
Existem métodos para VBA zip e descompacte usando o windows construído em compressão, o que deve dar uma ideia de como o sistema funciona.Você pode ser capaz de construir um desses métodos em uma linguagem de script de sua escolha.
O princípio básico é que no windows você pode tratar um arquivo zip como um diretório e copie para dentro e para fora dele.Então, para criar um novo arquivo zip, basta criar um arquivo com a extensão .zip
que tem o direito de cabeçalho para um vazio arquivo zip.Em seguida, você fechá-lo, e dizer o windows que você deseja copiar arquivos para ele como se ele fosse de outro diretório.
A descompactação é mais fácil - basta tratá-lo como um diretório.
No caso de páginas da web são perdidos de novo, aqui estão alguns dos relevantes trechos de código:
ZIP
Sub NewZip(sPath)
'Create empty Zip File
'Changed by keepITcool Dec-12-2005
If Len(Dir(sPath)) > 0 Then Kill sPath
Open sPath For Output As #1
Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0)
Close #1
End Sub
Function bIsBookOpen(ByRef szBookName As String) As Boolean
' Rob Bovey
On Error Resume Next
bIsBookOpen = Not (Application.Workbooks(szBookName) Is Nothing)
End Function
Function Split97(sStr As Variant, sdelim As String) As Variant
'Tom Ogilvy
Split97 = Evaluate("{""" & _
Application.Substitute(sStr, sdelim, """,""") & """}")
End Function
Sub Zip_File_Or_Files()
Dim strDate As String, DefPath As String, sFName As String
Dim oApp As Object, iCtr As Long, I As Integer
Dim FName, vArr, FileNameZip
DefPath = Application.DefaultFilePath
If Right(DefPath, 1) <> "\" Then
DefPath = DefPath & "\"
End If
strDate = Format(Now, " dd-mmm-yy h-mm-ss")
FileNameZip = DefPath & "MyFilesZip " & strDate & ".zip"
'Browse to the file(s), use the Ctrl key to select more files
FName = Application.GetOpenFilename(filefilter:="Excel Files (*.xl*), *.xl*", _
MultiSelect:=True, Title:="Select the files you want to zip")
If IsArray(FName) = False Then
'do nothing
Else
'Create empty Zip File
NewZip (FileNameZip)
Set oApp = CreateObject("Shell.Application")
I = 0
For iCtr = LBound(FName) To UBound(FName)
vArr = Split97(FName(iCtr), "\")
sFName = vArr(UBound(vArr))
If bIsBookOpen(sFName) Then
MsgBox "You can't zip a file that is open!" & vbLf & _
"Please close it and try again: " & FName(iCtr)
Else
'Copy the file to the compressed folder
I = I + 1
oApp.Namespace(FileNameZip).CopyHere FName(iCtr)
'Keep script waiting until Compressing is done
On Error Resume Next
Do Until oApp.Namespace(FileNameZip).items.Count = I
Application.Wait (Now + TimeValue("0:00:01"))
Loop
On Error GoTo 0
End If
Next iCtr
MsgBox "You find the zipfile here: " & FileNameZip
End If
End Sub
DESCOMPACTE
Sub Unzip1()
Dim FSO As Object
Dim oApp As Object
Dim Fname As Variant
Dim FileNameFolder As Variant
Dim DefPath As String
Dim strDate As String
Fname = Application.GetOpenFilename(filefilter:="Zip Files (*.zip), *.zip", _
MultiSelect:=False)
If Fname = False Then
'Do nothing
Else
'Root folder for the new folder.
'You can also use DefPath = "C:\Users\Ron\test\"
DefPath = Application.DefaultFilePath
If Right(DefPath, 1) <> "\" Then
DefPath = DefPath & "\"
End If
'Create the folder name
strDate = Format(Now, " dd-mm-yy h-mm-ss")
FileNameFolder = DefPath & "MyUnzipFolder " & strDate & "\"
'Make the normal folder in DefPath
MkDir FileNameFolder
'Extract the files into the newly created folder
Set oApp = CreateObject("Shell.Application")
oApp.Namespace(FileNameFolder).CopyHere oApp.Namespace(Fname).items
'If you want to extract only one file you can use this:
'oApp.Namespace(FileNameFolder).CopyHere _
'oApp.Namespace(Fname).items.Item("test.txt")
MsgBox "You find the files here: " & FileNameFolder
On Error Resume Next
Set FSO = CreateObject("scripting.filesystemobject")
FSO.deletefolder Environ("Temp") & "\Temporary Directory*", True
End If
End Sub
Outras dicas
Sim, este pode ser programado com o VBScript.Por exemplo, o código a seguir pode criar um zip a partir de um diretório:
Dim fso, winShell, MyTarget, MySource, file
Set fso = CreateObject("Scripting.FileSystemObject")
Set winShell = createObject("shell.application")
MyTarget = Wscript.Arguments.Item(0)
MySource = Wscript.Arguments.Item(1)
Wscript.Echo "Adding " & MySource & " to " & MyTarget
'create a new clean zip archive
Set file = fso.CreateTextFile(MyTarget, True)
file.write("PK" & chr(5) & chr(6) & string(18,chr(0)))
file.close
winShell.NameSpace(MyTarget).CopyHere winShell.NameSpace(MySource).Items
do until winShell.namespace(MyTarget).items.count = winShell.namespace(MySource).items.count
wscript.sleep 1000
loop
Set winShell = Nothing
Set fso = Nothing
Você também pode encontrar http://www.naterice.com/blog/template_permalink.asp?id=64 útil na medida em que inclui um completo Descompacte/Zip implementação em VBScript.
Se você fizer uma verificação de tamanho a cada 500 ms, ao invés de incluir uma contagem de item que ele funciona melhor para arquivos grandes.Win 7, grava o arquivo instantaneamente embora não terminado de compactação:
set fso=createobject("scripting.filesystemobject")
Set h=fso.getFile(DestZip)
do
wscript.sleep 500
max = h.size
loop while h.size > max
Funciona muito bem para grandes quantidades de arquivos de log.
Apenas para esclarecimento:O GZip não é um MS-apenas algoritmo, como sugerido por Guy Starbuck, em seu comentário, a partir de agosto.O GZipStream no Sistema.IO.Compressão utiliza o algoritmo Deflate, da mesma forma como a biblioteca zlib, e muitas outras ferramentas de zip.Essa classe é totalmente interoperável com os utilitários do unix, como o gzip.
A classe GZipStream não é programável por scripts a partir da linha de comandos ou VBScript, para produzir arquivos ZIP, então ele sozinho não seria uma resposta o poster original do pedido.
Livre DotNetZip biblioteca de ler e produzir arquivos zip, e pode ser programado a partir do VBScript ou Powershell.Ele também inclui ferramentas de linha de comando para produzir e ler/extrair arquivos zip.
Veja aqui algumas código VBScript:
dim filename
filename = "C:\temp\ZipFile-created-from-VBScript.zip"
WScript.echo("Instantiating a ZipFile object...")
dim zip
set zip = CreateObject("Ionic.Zip.ZipFile")
WScript.echo("using AES256 encryption...")
zip.Encryption = 3
WScript.echo("setting the password...")
zip.Password = "Very.Secret.Password!"
WScript.echo("adding a selection of files...")
zip.AddSelectedFiles("*.js")
zip.AddSelectedFiles("*.vbs")
WScript.echo("setting the save name...")
zip.Name = filename
WScript.echo("Saving...")
zip.Save()
WScript.echo("Disposing...")
zip.Dispose()
WScript.echo("Done.")
Aqui está um código para o Powershell:
[System.Reflection.Assembly]::LoadFrom("c:\\dinoch\\bin\\Ionic.Zip.dll");
$directoryToZip = "c:\\temp";
$zipfile = new-object Ionic.Zip.ZipFile;
$e= $zipfile.AddEntry("Readme.txt", "This is a zipfile created from within powershell.")
$e= $zipfile.AddDirectory($directoryToZip, "home")
$zipfile.Save("ZipFiles.ps1.out.zip");
Em uma .ou bastão .arquivo cmd, você pode usar o zipit.exe ou unzip.exe as ferramentas.Por exemplo:
zipit NewZip.zip -s "This is string content for an entry" Readme.txt src
Aqui a minha tentativa de resumir construído em recursos do windows para compressão e descompressão - Como posso compactar (zip ) e descomprimir (/ descompactar arquivos e pastas com o arquivo em lotes sem uso de ferramentas externas?
com alguns dada soluções que deve funcionar em quase todos máquina windows.
No que se refere à shell.aplicação e o WSH eu preferia o jscript como ele permite que um híbrido de lote/arquivo jscript (com .bastão de extensão) que não necessitam de arquivos temporários.Eu coloquei descompacte o zip e capacidades em um arquivo além de mais alguns recursos.
Há tanto zip e descompacte os arquivos executáveis (bem como um barco carregado de outras aplicações úteis) no UnxUtils pacote disponível no SourceForge (http://sourceforge.net/projects/unxutils).Copie-os para um local no seu CAMINHO, como 'c:\windows' e você será capaz de incluí-los em seus scripts.
Esta não é a solução perfeita (ou o que você pediu), mas um trabalho digno de um todo.
para criar um arquivo compactado, você pode usar o utilitário MAKECAB.EXE