内置在 Windows XP/Vista/2003/2008 中的 ZIP 压缩是否完全可以编写脚本?我必须从 BAT/CMD 文件调用什么可执行文件?或者可以用VBScript来做吗?
6 回答
也有使用内置压缩的 Windows 进行压缩和解压缩的 VBA 方法,这应该可以让您了解系统的运行方式。您可以将这些方法构建到您选择的脚本语言中。
基本原则是,在 Windows 中,您可以将 zip 文件视为一个目录,并可以从中复制和复制。因此,要创建一个新的 zip 文件,您只需制作一个扩展名为.zip
空 zip 文件的正确标题的文件。然后你关闭它,并告诉windows你想把文件复制到它里面,就好像它是另一个目录一样。
解压缩更容易 - 只需将其视为目录即可。
万一网页再次丢失,这里有一些相关的代码片段:
压缩
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
适用于大量日志文件。
只是为了清楚起见:GZip 并不是 Guy Starbuck 在 8 月的评论中建议的仅限 MS 的算法。System.IO.Compression 中的 GZipStream 使用 Deflate 算法,与 zlib 库和许多其他 zip 工具相同。该类与 gzip 等 unix 实用程序完全可互操作。
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");
在 .bat 或 .cmd 文件中,您可以使用 zipit.exe 或 unzip.exe 工具。例如:
zipit NewZip.zip -s "This is string content for an entry" Readme.txt src
在 SourceForge ( http://sourceforge.net/projects/unxutils )上的 UnxUtils 包中有 zip 和 unzip 可执行文件(以及大量其他有用的应用程序)。将它们复制到 PATH 中的某个位置,例如 'c:\windows',您将能够将它们包含在脚本中。
这不是完美的解决方案(或您要求的解决方案),而是一个体面的工作。
要创建压缩存档,您可以使用实用程序 MAKECAB.EXE
这是我尝试总结用于压缩和解压缩的内置功能窗口 -如何在不使用任何外部工具的情况下使用批处理文件压缩 (/ zip ) 和解压缩 (/ unzip ) 文件和文件夹?
一些给定的解决方案应该适用于几乎每台 Windows 机器。
至于shell.application和 WSH,我更喜欢jscript ,因为它允许混合批处理/jscript 文件(带有 .bat 扩展名),不需要临时文件。我已经将解压缩和压缩功能放在一个文件中以及更多功能.