Windows内置的ZIP压缩可以编写脚本吗?

Windows XP / Vista / 2003/2008内置的ZIP压缩是否可以编写脚本? 我必须从BAT / CMD文件中调用什么可执行文件? 或者是否可以用VBScript来做到这一点?

我意识到这是可能的使用WinZip , 7-Zip和其他外部应用程序,但我正在寻找的东西,不需要安装外部应用程序。

有一些VBA方法可以使用内置压缩的窗口进行压缩和解压缩,这应该能够让我们对系统的运行方式有所了解。 您可以将这些方法构build成您所select的脚本语言。

基本的原则是,在Windows中你可以把一个zip文件作为一个目录,并将其拷贝进去。 因此,要创build一个新的zip文件,只需制作一个扩展名为.zip的文件,该文件的.zip zip文件就是正确的。 然后你closures它,并告诉你想要将文件复制到它的窗户,就好像它是另一个目录。

解压缩更容易 – 只要把它当作目录即可。

万一网页再次丢失,下面是一些相关的代码片段:

压缩

 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 

UNZIP

 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来编写脚本。 例如下面的代码可以从一个目录创build一个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 

你也可以findhttp://www.naterice.com/blog/template_permalink.asp?id=64有帮助,因为它包括一个完整的VBScript中的解压缩/ Zip实现。

如果您每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并不是像Guy Starbuck在8月份发表的评论中所build议的那样,是一个仅MS的algorithm。 System.IO.Compression中的GZipStream使用Deflatealgorithm,就像zlib库以及其他许多压缩工具一样。 该类与gzip等unix实用程序完全可互操作。

GZipStream类不能从命令行或VBScript编写脚本来生成ZIP文件,所以它本身不会是原始发布者的请求的答案。

免费的DotNetZip库不会读取和生成压缩文件,并可以从VBScript或Powershell中编写脚本。 它还包括用于生成和读取/提取压缩文件的命令行工具。

这是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"); 

在.bat或.cmd文件中,您可以使用zipit.exe或unzip.exe工具。 例如:

 zipit NewZip.zip -s "This is string content for an entry" Readme.txt src 

我试图总结压缩和解压缩的内置function窗口 – 如何在不使用任何外部工具的情况下使用batch file压缩(/ zip)和解压缩(/ unzip)文件和文件夹?

几乎所有的解决scheme都可以在几乎所有的Windows机器上运行。

至于shell.application和WSH,我更喜欢jscript,因为它允许一个不需要临时文件的混合批处理/ jscript文件(带有.bat扩展名)。我把解压缩和zip压缩function放在一个文件中再加上一些function。

在SourceForge上提供的UnxUtils包( http://sourceforge.net/projects/unxutils )中有zip和unzip可执行文件(以及其他有用的应用程序)。 将它们复制到PATH中的某个位置,例如“c:\ windows”,并且可以将它们包含在脚本中。

这不是一个完美的解决scheme(或者你要求的),而是一个体面的工作。

创build一个压缩的档案,您可以使用实用程序MAKECAB.EXE