Tạo thư mục .zip từ dòng lệnh - (Windows)


57

Có thể tạo tệp .zip từ một thư mục trong dòng lệnh, tôi không muốn sử dụng bất kỳ thực thi của bên thứ ba nào.

Tôi đã suy nghĩ điều gì đó như 'gửi đến thư mục nén' nhưng tôi không biết làm thế nào ...


2
Có một công cụ trong bộ tài nguyên Windows được gọi là compress.exe.
ho1

2
Đây là một liên kết đến một câu hỏi ServerFault chỉ thảo luận về vấn đề này: serverfault.com/questions/39071/iêu
ho1

Câu trả lời:



7

Tôi không nghĩ rằng có một dòng lệnh cho các tệp ZIP được tích hợp trong Windows (Khác với compressBộ tài nguyên máy chủ 2003). Bạn sẽ phải sử dụng một bên thứ ba. Mọi người đều thích 7zip !


6

Tôi đã kết hợp kịch bản này từ nhiều nguồn khác nhau để phù hợp hơn với nhu cầu của mình. Sao chép và dán tập lệnh vào một tệp có phần mở rộng ".vbs". Kịch bản ban đầu được tạo cho Windows XP, nhưng nó cũng hoạt động trong Windows 7 x64 Ultimate - không đảm bảo nếu Windows sẽ giữ xung quanh các đối tượng Shell khác nhau mà ứng dụng này sử dụng.

Cách sử dụng: trong hộp chạy hoặc dòng lệnh put-

"C:\zipper.vbs" "C:\folderToZip\" "C:\mynewzip.zip"

Đường dẫn đến tập lệnh, thư mục nguồn, tệp zip để tạo (bao gồm .zip ở cuối).

Nó sẽ không sao chép các thư mục trống vì vậy hãy cẩn thận.

Đây là mã vbs ---

Set Args = Wscript.Arguments
source = Args(0)
target = Args(1)

' make sure source folder has \ at end
If Right(source, 1) <> "\" Then
    source = source & "\"
End If

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set zip = objFSO.OpenTextFile(target, 2, vbtrue)
' this is the header to designate a file as a zip
zip.Write "PK" & Chr(5) & Chr(6) & String( 18, Chr(0) )
zip.Close
Set zip = nothing

wscript.sleep 500

Set objApp = CreateObject( "Shell.Application" )
intSkipped = 0

' Loop over items within folder and use CopyHere to put them into the zip folder
For Each objItem in objApp.NameSpace( source ).Items
    If objItem.IsFolder Then
        Set objFolder = objFSO.GetFolder( objItem.Path )
        ' if this folder is empty, then skip it as it can't compress empty folders
        If objFolder.Files.Count + objFolder.SubFolders.Count = 0 Then
            intSkipped = intSkipped + 1
        Else
            objApp.NameSpace( target ).CopyHere objItem
        End If
    Else
        objApp.NameSpace( target ).CopyHere objItem
    End If
Next

intSrcItems = objApp.NameSpace( source ).Items.Count
wscript.sleep 250

' delay until at least items at the top level are available
Do Until objApp.NameSpace( target ).Items.Count + intSkipped = intSrcItems
    wscript.sleep 200
Loop

'cleanup
Set objItem = nothing
Set objFolder = nothing
Set objApp = nothing
Set objFSO = nothing

1
Có vẻ đầy hứa hẹn, nhưng tôi đã nhận được một lỗi "Đối tượng cần thiết: 'objApp.NameSpace (...)' trên dòng 16
pieaveragy

Tôi có cùng một vấn đề. Đoạn mã trên không hoạt động hoặc cần một số nội dung bổ sung trong hệ thống mà người đăng quên không đề cập.
Shaamaan

Nó sử dụng WScript (môi trường vbs) và một số đối tượng Shell. Tất cả đã được cài đặt theo mặc định trong Windows XP (doanh nghiệp?) Và Win 7 Ultimate x64. Có lẽ họ còn ở đó cho Win8?
WSkid

2

Có thể chạy tập lệnh PowerShell từ BAT. Bat file nhận đường dẫn đến dir để được nén và tên tệp zip làm tham số.

@echo off
setlocal

rem First parameter - path to dir to be zipped
rem Second parameter- zip file name
set sourceDir=%1
set zipFile=%2

rem Create PowerShell script
echo Write-Output 'Custom PowerShell profile in effect!'    > %~dp0TempZipScript.ps1
echo Add-Type -A System.IO.Compression.FileSystem           >> %~dp0TempZipScript.ps1
echo [IO.Compression.ZipFile]::CreateFromDirectory('%sourceDir%','%~dp0%zipFile%') >> %~dp0TempZipScript.ps1

rem Execute script with flag "-ExecutionPolicy Bypass" to get around ExecutionPolicy
PowerShell.exe -ExecutionPolicy Bypass -Command "& '%~dp0TempZipScript.ps1'"
del %~dp0TempZipScript.ps1
endlocal

1
Nhưng điều gì sẽ là lợi thế cho phương pháp này? Tại sao không chỉ viết tập lệnh PowerShell vào một tệp cố định và để nó chấp nhận tham số?
Seth

Tôi đã thử tất cả các giải pháp khác. đây là giải pháp duy nhất không an toàn mà hoạt động hoàn hảo. Ưu điểm quan trọng nhất là sử dụng các lệnh gốc của powershell và không cần tạo VBScript công nghệ cũ.
desmati

Điều này làm việc cho tôi trên một máy tính xách tay windows7 của công ty cũ vào năm 2019.
simbo1905

1

Đây là một liên kết tuyệt vời cho thấy cách nén tệp bằng các lệnh gốc của windows.

Bạn có thể nén tệp từ dấu nhắc lệnh bằng cách sử dụng khả năng tích hợp sẵn của Windows để nén tệp không?

Tôi đã thử nghiệm nó với một thư mục chứa nhiều tệp và thư mục lồng nhau và nó hoạt động hoàn hảo. Chỉ cần làm theo định dạng của dòng lệnh.

Ngoài ra còn có một cách để giải nén các tập tin thông qua dòng lệnh mà tôi tìm thấy. Một cách, chỉ cần mở một cửa sổ thám hiểm cho biết nội dung của tệp nén là gì. Một số trong số này cũng sử dụng Java không nhất thiết phải có nguồn gốc từ windows nhưng phổ biến đến mức nó gần như là như vậy.

Windows 7 có giải nén tại dòng lệnh được cài đặt theo mặc định không?

https://stackoverflow.com/questions/1021557/how-to-unzip-a-file-USE-the-command-line


3
Bạn nên bao gồm các hướng dẫn trong câu trả lời của bạn. Nếu các liên kết trở nên cũ kỹ, câu trả lời của bạn sẽ vô giá trị ...
MoonSire

1

Đây là một câu hỏi cũ, nhưng sự liên quan của nó vẫn còn hiện tại.

Windows tất nhiên có thuật toán nén riêng được tích hợp để sử dụng các tệp zip, nhưng, nó thực sự hoạt động kém khi so sánh với sản phẩm nguồn mở 7zip được tìm thấy ở đây http://www.7-zip.org/

Những người khác đã thảo luận về các phương pháp khác nhau để sử dụng các chức năng tích hợp trong windows, giải pháp của tôi yêu cầu cài đặt phần mềm bổ sung.

7Zip hỗ trợ nhiều loại tệp, bao gồm ZIP, RAR, CAB và ISO và nó có định dạng 7z.

Bạn có thể xem trợ giúp dòng lệnh: "C: \ Chương trình tập tin \ 7-Zip \ 7z.exe" - trợ giúp

để thực hiện thêm một kho lưu trữ zip đơn giản:

"C: \ Tệp chương trình \ 7-Zip \ 7z.exe" tên tệp.zip c: \ path


1

Đây là một ý tưởng khác, từ 4 nguồn khác nhau; không phải ý tưởng của tôi, nhưng tôi đã biên soạn chúng để làm cho nó hoạt động

<!-- : Begin batch script
@each off

set sourceFolder="c:\test"
set destZip="%userprofile%\desktop\example.zip"

cscript //nologo "%~f0?.wsf" //job:exewsh %sourceFolder% %destZip%

exit /b
GOTO:EOF
----- Begin wsf script --->
<package><job id="exewsh"><script language="VBScript">
'Get command-line arguments.
Set objArgs = WScript.Arguments
InputFolder = objArgs(0)
ZipFile = objArgs(1)

'Create empty ZIP file.
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)

Set objShell = CreateObject("Shell.Application")
Set source = objShell.NameSpace(InputFolder).Items
objShell.NameSpace(ZipFile).CopyHere(source)

'Required!
wScript.Sleep 2000
</script></job>
</package>

2
Chào mừng bạn đến với Siêu người dùng ! Đây rõ ràng là một kịch bản phức tạp. Bạn có thể giải thích những gì nó làm, và làm thế nào để sử dụng nó?
jpaugh

1

Hãy tưởng tượng rằng bạn muốn nén cùng một thư mục mà bạn đang sử dụng Command Prompt mà KHÔNG mở cửa sổ powershell:

powershell Compress-Archive . publish.zip

Đó không phải là những gì tôi đặt ra, nhưng nó sẽ làm việc cho tôi bây giờ. Đó là một mẹo hữu ích để biết.
bballdave025

0

Tôi sẽ đăng một cái gì đó liên quan đến câu trả lời của WSkids vì thật đáng buồn là tôi không thể sử dụng chức năng bình luận.

Sử dụng phương thức CopyHere () trong VBS giới thiệu một số vấn đề. Một trong những vấn đề này là phương thức trả về ngay lập tức trong khi quá trình sao chép bắt đầu ở chế độ nền trong khi nhiều lệnh gọi CopyHere () sẽ can thiệp lẫn nhau và ZIP sẽ không được tạo chính xác. Một vòng lặp chờ đợi là cần thiết ở đây để khắc phục điều đó. Vòng lặp chờ của tôi dựa trên một câu trả lời cho một vấn đề tương tự được đăng ở đây .

Đây là một phiên bản cập nhật giúp sửa lỗi "Yêu cầu đối tượng" được báo cáo bởi pieaveragy . Đây là một vấn đề thời gian vì tệp ZIP mới được tạo được bao gồm trong bộ sưu tập Mục khi tập lệnh được thực thi trên các máy nhanh.

set Args = WScript.Arguments
source = Args(0)
' remove trailing slashes as we add slashes when needed later
while Right(source, 1) = "\"
    source = Mid(source, 1, Len(source) - 1)
wend

target = Args(1)

' create empty ZIP file
set fso = CreateObject("Scripting.FileSystemObject")
set zip = fso.OpenTextFile(target, 2, vbtrue)
' write ZIP header, this ensures that Windows recognizes the file as "ZIP Folder"
zip.Write "PK" & Chr(5) & Chr(6) & String(18, Chr(0))
zip.Close
set zip = nothing
set fso = nothing

' copy files to ZIP file
set app = CreateObject("Shell.Application")

set sourceFolderObj = app.NameSpace(source)
set targetFolderObj = app.NameSpace(target)

for each item in sourceFolderObj.Items
  itemPath = source & "\" & item.Name

  copyItem = false

  ' ZIP file is included in Items collection and is recognized as folder, thus skip it to avoid script errors
  if itemPath <> target then
    if item.IsFolder then
      if item.GetFolder.Items().Count = 0 then
        ' folder is empty, skip it as empty folders can't be compressed
      else
        copyItem = true
      end if
    else
      copyItem = true
    end if
  end if

  if copyItem then
    targetFolderObj.CopyHere item

    ' wait until the file appears in the ZIP file, 
    ' this is needed because CopyHere() returns immediately after starting an asynchronous copy process 
    ' (starting multiple asynchronous copy will not work as it causes error messages, an invalid ZIP file, ...)
    while (targetFolderObj.ParseName(item.Name) is nothing)
      WScript.Sleep 1
    wend
  end If
next

set targetFolderObj = nothing
set sourceFolderObj = nothing
set app = nothing

0

Đây là nỗ lực của tôi để tóm tắt các cửa sổ khả năng tích hợp để nén và giải nén - https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and- Folders -với lô-f

với một vài giải pháp nhất định sẽ hoạt động trên hầu hết mọi máy tính windows.


Vui lòng mở rộng câu trả lời của bạn - nó phụ thuộc quá nhiều vào một liên kết có thể chết bất cứ lúc nào.
studiohack
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.