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

问题描述:

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

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

+0

在Google上有各种可用的VBScript实现,例如“[使用Windows Shell(XP,Vista,2003和2008)和VBScript压缩和解压缩文件](http://www.naterice.com/blog/template_permalink.asp?id=64)”。我没有测试过这些,但它们很可能只是'拉链',而不是压缩。 – samjudson 2008-08-27 14:11:11

+1

你在拉链和压缩之间有什么区别? – Cheeso 2009-07-30 04:36:53

+1

您可以将文件'压缩'成一个文件而不压缩它们,就像unix中的'tar'一样。这使您可以将文件作为包分发,但不会减小它们的磁盘空间大小。 – samjudson 2009-08-06 15:22:26

对于zipunzip,还有使用内置压缩的窗口的VBA方法,它应该提供关于系统如何操作的一些信息。您可以将这些方法构建为您选择的脚本语言。

基本原理是,在Windows中,您可以将zip文件视为目录,并将其拷入和拷出。因此,要创建一个新的zip文件,只需制作一个扩展名为.zip的文件,该文件具有空白zip文件的正确标题。然后你关闭它,并告诉你想将文件复制到它的窗口,就好像它是另一个目录一样。

解压缩更简单 - 只需将其视为目录即可。

如果网页被再度迷失,这里有一些相关的代码片段:

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 

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 

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

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

+2

UnxUtils项目似乎不再被维护(自2007年以来没有任何新增功能)。 [GNUWin32项目](http://gnuwin32.sourceforge.net/)在Windows上具有更新版本的GNU工具。它包括[InfoZip](http://www.info-zip.org/)的zip/unzip压缩版本。但是直接InfoZip [从他们自己的源代码]构建(http://sourceforge.net/projects/infozip/files/)会更好更安全。 – dolmen 2011-03-26 23:00:46

是的,这可以用脚本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有用,因为它包括在VBScript中一个完整的解压缩/ ZIP实现。

如果您每500毫秒执行一次大小检查而不是项目计数,则它对大文件更好。

set fso=createobject("scripting.filesystemobject") 
Set h=fso.getFile(DestZip) 
do 
    wscript.sleep 500 
    max = h.size 
loop while h.size > max 

的伟大工程大量的日志文件:Win 7的,尽管它尚未完成压缩瞬间写入文件。

仅供参考:Gzip不是Guy Starbuck在8月份的评论中提出的仅MS的算法。 System.IO.Compression中的GZipStream使用Deflate算法,就像zlib库以及其他许多zip工具一样。该类与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 

创建压缩存档,您可以使用该实用程序MAKECAB.EXE

Here'a我试图总结为压缩和解压缩内置功能窗口 - How can I compress (/ zip) and uncompress (/ unzip) files and folders with batch file without using any external tools?

用几乎没有几个解决方案可以在几乎所有的Windows机器上运行

至于到shell.application和WSH我优选jscript ,因为它允许混合料/ JScript文件(具有扩展名.BAT),其不需要临时files.I've把解压和zip能力在一个文件加上几个更多的功能。