Можно ли использовать встроенное сжатие ZIP в Windows?
можно ли вообще использовать сжатие ZIP, встроенное в Windows XP/Vista/2003/2008? Какой исполняемый файл мне нужно вызвать из файла BAT/CMD? или это можно сделать с помощью VBScript?
Я понимаю, что это возможно с помощью WinZip, 7-Zip и другие внешние приложения, но я ищу что-то, что не требует установки внешних приложений.
6 ответов:
есть методы VBA для zip и распакуйте использование окон, встроенных в сжатие, а также, что должно дать некоторое представление о том, как работает система. Вы можете быть в состоянии построить эти методы в языке сценариев по вашему выбору.
основной принцип заключается в том, что в windows вы можете обрабатывать zip-файл как каталог и копировать в него и из него. Таким образом, чтобы создать новый zip-файл, вы просто делаете файл с расширением
.zip
что имеет правый заголовок для пустого zip-файла. Затем вы закрываете его и говорите windows, что хотите скопировать файлы в него, как если бы это был другой каталог.распаковка проще - просто рассматривать его как каталог.
в случае, если веб-страницы будут потеряны снова, вот несколько соответствующих фрагментов кода:
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
распакуйте
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
Да, это может быть сценарий с VBScript. Например, следующий код может создать zip из папки:
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
вы также можете найти http://www.naterice.com/blog/template_permalink.asp?id=64 полезно, поскольку он включает в себя полную реализацию распаковки/Zip в VBScript.
Если вы проверяете размер каждые 500 мс, а не количество элементов, он лучше работает для больших файлов. Win 7 записывает файл мгновенно, хотя он еще не закончен сжатие:
set fso=createobject("scripting.filesystemobject") Set h=fso.getFile(DestZip) do wscript.sleep 500 max = h.size loop while h.size > max
отлично подходит для огромного количества файлов журнала.
просто для ясности: GZip - это не алгоритм MS-only, как предложил Гай Старбак в своем комментарии от августа. GZipStream в System.IO.Compression использует алгоритм Deflate, такой же, как библиотека zlib, и многие другие инструменты zip. Этот класс полностью совместим с утилитами unix, такими как gzip.
класс GZipStream не может быть написан из командной строки или VBScript для создания ZIP-файлов, поэтому он сам по себе не будет отвечать на запрос оригинального плаката.
свободный DotNetZip библиотека читает и создает zip-файлы и может быть написана из VBScript или Powershell. Он также включает в себя инструменты командной строки для получения и чтения/извлечения файлов zip.
вот код для 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.")
вот код для 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");
В a .летучая мышь или. cmd файл, вы можете использовать zipit.exe или разархивировать.ехе инструменты. Например:
zipit NewZip.zip -s "This is string content for an entry" Readme.txt src
вот моя попытка обобщить встроенные возможности windows для сжатия и распаковки - Как я могу сжимать (/ zip ) и распаковывать (/unzip ) файлы и папки с помощью пакетного файла без использования каких-либо внешних инструментов?
с несколькими заданными решениями, которые должны работать почти на каждой машине windows.
в отношении shell.применение и WSH я предпочел jscript как это позволяет гибридный пакетный / jscript-файл (с. bat extension), которые не требуют временных файлов.Я поместил возможности распаковки и zip в один файл плюс еще несколько функций.
в пакете UnxUtils, доступном на SourceForge (), есть как zip, так и unzip исполняемые файлы (а также множество других полезных приложений http://sourceforge.net/projects/unxutils). скопируйте их в место на вашем пути, например 'c:\windows-и вы сможете включить их в свои сценарии.
Это не идеальное решение (или тот, который вы просили), но достойный труд-круглый.