2008-08-27 11 views
53

Nén ZIP được tích hợp vào Windows XP/Vista/2003/2008 có thể được viết kịch bản không? Tôi sẽ phải thực thi những gì từ một tệp BAT/CMD? hoặc là nó có thể làm điều đó với VBScript?Có thể tập lệnh nén ZIP tích hợp của Windows không?

Tôi nhận thấy rằng điều này có thể sử dụng WinZip, 7-Zip và các ứng dụng bên ngoài khác, nhưng tôi đang tìm một thứ không yêu cầu cài đặt ứng dụng bên ngoài.

+0

Có nhiều triển khai VBScript khác nhau có sẵn trên Google, ví dụ: "[Zip và UnZip tập tin bằng cách sử dụng Windows Shell (XP, Vista, 2003 và 2008) và VBScript] (http://www.naterice.com/blog/template_permalink.asp?id=64)". Tôi chưa thử nghiệm nhưng có nhiều khả năng họ chỉ 'zip', không nén. – samjudson

+1

sự khác biệt bạn đang vẽ giữa zip và nén là gì? – Cheeso

+1

Bạn có thể 'nén' các tệp thành một tệp duy nhất mà không cần nén chúng, giống như 'tar' trong unix. Điều này cho phép bạn phân phối các tệp dưới dạng gói, nhưng không giảm dung lượng đĩa của chúng. – samjudson

Trả lời

28

Có các phương pháp VBA để zipunzip bằng cách sử dụng các cửa sổ được nén cũng như sẽ cung cấp một số thông tin chi tiết về cách hoạt động của hệ thống. Bạn có thể xây dựng các phương thức này thành ngôn ngữ kịch bản mà bạn chọn.

Nguyên tắc cơ bản là trong các cửa sổ, bạn có thể xử lý tệp zip dưới dạng thư mục và sao chép vào và ra khỏi tệp đó. Vì vậy, để tạo một tệp zip mới, bạn chỉ cần tạo một tệp có phần mở rộng .zip có tiêu đề phù hợp cho tệp zip trống. Sau đó, bạn đóng nó, và nói với cửa sổ bạn muốn sao chép các tập tin vào nó như thể nó là một thư mục khác.

Giải nén dễ dàng hơn - chỉ coi đó là thư mục.

Trong trường hợp các trang web bị mất một lần nữa, sau đây là một vài trong số các đoạn mã liên quan:

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 

giải nén

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 
+7

Lưu ý: Các kịch bản được đăng dựa vào hành vi phụ thuộc vào thực thi của vỏ Windows và, ví dụ, có thể dễ dàng phá vỡ khi phần mềm nén của bên thứ ba thay đổi các động từ OLE mặc định cho lưu trữ ZIP. Ngoài ra, các đối tượng COM zipfldr.dll được * không * tài liệu hoặc được hỗ trợ cho việc sử dụng này bởi MS. –

+0

Giả, động từ OLE trên các tệp zip không ảnh hưởng đến các tập lệnh được cung cấp ở trên. Không hỗ trợ (hoặc tài liệu) nó không tự động có nghĩa là MS sẽ phá vỡ nó. Họ có thể, nhưng sau đó họ có thể ghi lại nó quá. – wqw

+0

Các liên kết đã chết – beerwin

1

Có cả tệp thực thi zip và giải nén (cũng như tải trọng của các ứng dụng hữu ích khác) trong gói UnxUtils có sẵn trên SourceForge (http://sourceforge.net/projects/unxutils). Sao chép chúng vào một vị trí trong PATH của bạn, chẳng hạn như 'c: \ windows' và bạn sẽ có thể đưa chúng vào tập lệnh của mình.

Đây không phải là giải pháp hoàn hảo (hoặc giải pháp bạn yêu cầu) mà là một công việc hợp lý.

+2

Dự án UnxUtils dường như không còn được duy trì nữa (không có gì mới kể từ năm 2007). Dự án [GNUWin32] (http://gnuwin32.sourceforge.net/) có các bản phát hành GNU mới hơn trên Windows. Nó bao gồm các bản dựng/giải nén của [InfoZip] (http://www.info-zip.org/). Nhưng nó là tốt hơn và an toàn hơn để trực tiếp InfoZip xây dựng [từ nguồn riêng của họ] (http://sourceforge.net/projects/infozip/files/). – dolmen

24

Vâng, điều này có thể được kịch bản với VBScript. Ví dụ: mã sau có thể tạo mã zip từ thư mục:

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 

Bạn cũng có thể tìm thấy http://www.naterice.com/blog/template_permalink.asp?id=64 hữu ích vì nó bao gồm triển khai thực hiện Unzip/Zip đầy đủ trong VBScript.

Nếu bạn thực hiện kiểm tra kích thước mỗi 500 ms thay vì số mục, nó hoạt động tốt hơn cho các tệp lớn. Win 7 ghi tập tin ngay lập tức mặc dù nó không hoàn thành nén:

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

Hoạt động tốt cho số lượng lớn tệp nhật ký.

+0

Tính năng này có hoạt động trên Vista không? Tôi đã gặp phải một số vấn đề và tôi sẵn sàng tuyên bố rằng Vista là thủ phạm. – Icode4food

5

Chỉ cần để làm rõ: GZip không phải là thuật toán chỉ MS theo gợi ý của Guy Starbuck trong bình luận của anh ấy từ tháng 8. GZipStream trong System.IO.Compression sử dụng thuật toán Deflate, giống như thư viện zlib và nhiều công cụ zip khác. Lớp đó hoàn toàn tương thích với các tiện ích unix như gzip.

Lớp GZipStream không thể viết được từ dòng lệnh hoặc VBScript, để tạo tệp ZIP, do đó, nó sẽ không phải là câu trả lời yêu cầu của người đăng ban đầu.

Thư viện DotNetZip miễn phí không đọc và tạo tệp zip và có thể được viết từ VBScript hoặc Powershell. Nó cũng bao gồm các công cụ dòng lệnh để tạo và đọc/giải nén các tệp zip.

Dưới đây là một số mã cho 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.") 

Dưới đây là một số mã cho 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"); 

Trong một .bat hoặc .cmd tập tin, bạn có thể sử dụng zipit.exe hoặc unzip.exe công cụ. Ví dụ:

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

để tạo ra một tài liệu nén bạn có thể sử dụng tiện ích MAKECAB.EXE

+0

Không phải là các tệp ZIP, nhưng vẫn còn, nó có thể tiện dụng, cảm ơn! – travis

+1

-1 - CAB không phải là ZIP – user66001

2

Here'a nỗ lực của tôi để tóm tắt khả năng tích hợp trong các cửa sổ cho nén và uncompression - How can I compress (/ zip) and uncompress (/ unzip) files and folders with batch file without using any external tools?

với một vài giải pháp được đưa ra sẽ hoạt động trên hầu hết mọi máy tính.

Như liên quan đến các shell.application và WSH tôi ưa thích jscript vì nó cho phép một tập tin batch/JScript lai (với đuôi mở rộng .bat) mà không yêu cầu tạm files.I've đặt khả năng giải nén và zip trong một tệp cùng với một vài tính năng khác.

Các vấn đề liên quan