Windows XP / Vista / 2003/2008中内置的ZIP压缩是否能够编写脚本?我必须从BAT / CMD文件中调用哪些可执行文件?或者是否可以使用VBScript进行?
答案 0 :(得分:32)
还有zip和unzip使用压缩内置窗口的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
答案 1 :(得分:26)
是的,这可以使用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
适用于大量日志文件。
答案 2 :(得分:5)
为了清楚起见: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
答案 3 :(得分:2)
这是我尝试总结压缩和解压缩的内置功能窗口 - 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)不需要临时文件。我已经将解压缩和zip功能放在一个文件中,再加上一些功能。
答案 4 :(得分:1)
在SourceForge(http://sourceforge.net/projects/unxutils)上提供的UnxUtils包中有zip和unzip可执行文件(以及其他有用应用程序的船载)。将它们复制到PATH中的某个位置,例如“c:\ windows”,您就可以将它们包含在脚本中。
这不是一个完美的解决方案(或者你要求的那个),而是一个体面的工作。
答案 5 :(得分:1)
要创建压缩存档,您可以使用实用程序MAKECAB.EXE