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

我意识到这可以使用 压缩包, 7-拉链 和其他外部应用程序,但我正在寻找不需要安装外部应用程序的东西。

有帮助吗?

解决方案

有VBA方法可以 压缩解压 还使用内置压缩的 Windows,这应该可以让您了解系统如何运行。您可以将这些方法构建到您选择的脚本语言中。

基本原理是,在 Windows 中,您可以将 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

解压缩

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 很有帮助,因为它包含 VBScript 中的完整 Unzip/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 

非常适合大量日志文件。

只是为了清楚起见:正如 Guy Starbuck 在 8 月份的评论中所建议的那样,GZip 并不是一种仅限 MS 的算法。System.IO.Compression 中的 GZipStream 使用 Deflate 算法,与 zlib 库和许多其他 zip 工具相同。该类可以与 gzip 等 Unix 实用程序完全互操作。

GZipStream 类无法从命令行或 VBScript 编写脚本来生成 ZIP 文件,因此它本身并不能满足原始发布者的请求。

免费 点网压缩 库确实读取并生成 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");

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

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

这是我尝试总结压缩和解压缩的内置功能窗口 - 如何在不使用任何外部工具的情况下使用批处理文件压缩(/ zip )和解压缩(/ unzip )文件和文件夹?

一些给定的解决方案应该适用于几乎所有 Windows 机器。

至于 shell.应用程序 和 WSH 我更喜欢 脚本因为它允许混合批处理/jscript 文件(带有 .bat 扩展名),不需要临时文件。我已将解压缩和压缩功能放入一个文件中,并添加了一些其他功能。

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

这不是完美的解决方案(或您要求的解决方案),而是一个不错的解决方案。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top