Làm cách nào bạn có thể nén hoặc giải nén từ tập lệnh bằng các khả năng tích hợp sẵn của Windows?


294

Trong Windows, bạn có thể nén một số tệp bằng cách

nhấp chuột phải → Gửi đếnthư mục nén (nén)

Và giải nén bằng cách nhấp đúp vào .ziptệp và giải nén các tệp.

Có cách nào để áp dụng các khả năng đó từ tập lệnh (tệp .bat) mà không cần cài đặt bất kỳ phần mềm của bên thứ ba nào không?



16
Chà, có lẽ là để gọi nó từ một tệp bó hoặc một chương trình. (Đó là lý do tại sao tôi ở đây - cố gắng tạo một tệp .BAT nhanh để "xây dựng" một sản phẩm nhỏ cho một trang web yêu cầu nó phải là tệp zip.)
Jon Coombs

46
Điên rồ rằng câu hỏi này đã bị đóng cửa.
Sam Goldberg

1
Có thể chuyển câu hỏi này sang Super User không?
Hanxue

21
Vẫn rất hữu ích và có liên quan trong năm 2018 .: P
Michael Fever

Câu trả lời:


82

Trở lại năm 2013, điều đó là không thể. Microsoft đã không cung cấp bất kỳ thực thi nào cho việc này.

Xem liên kết này để biết một số cách VBS để làm điều này. /superuser/201371/create-zip-folder-from-the-command-line-windows

Từ Windows 8 trở đi, .NET Framework 4.5 được cài đặt theo mặc định, với System.IO.Compression.ZipArchive và PowerShell có sẵn, người ta có thể viết các tập lệnh để đạt được điều này, xem https://stackoverflow.com/a/26843122/71312


1
Điều này không đúng vì PS cho phép điều này và được cài đặt sẵn trên Windows và có sẵn thông qua dòng lệnh.
Dan Atkinson

4
@DanAtkinson Cập nhật. Nó đã được trả lời vào năm 2013, liên kết cung cấp một số cách VBS. Cách PS cần .Net 4.5, cần Windows 8 trở lên.
Diryboy

Cảm ơn các cập nhật! Đã sửa đổi phiếu bầu của tôi cho phù hợp. :)
Dan Atkinson

6
@MichaelMrozek "dòng lệnh" nói chung chung cho bất kỳ dòng lệnh nào, không cụ thể là CMD / HÀNH, và PS chắc chắn là một dòng lệnh, như bash, sh, rsh trên * nix. Nhưng chỉ cần đi xa hơn, vì bạn có thể chạy powershell từ dòng lệnh, nó sẽ trả lời câu hỏi ngay cả khi bạn muốn tin rằng lệnh cmd / là dòng lệnh duy nhất và duy nhất.
Robert McKee

1
đã có thể trở lại vào năm 2013 (không cài đặt bất kỳ phần mềm bổ sung). Xem câu hỏi Siêu người dùng . Có thể kể từ khi Windows XP ra mắt vào năm 2001. Chức năng ZIP tích hợp trong Windows XP có thể được tận dụng vì nó được hiển thị thông qua giao diện COM .
Peter Mortensen

180

Để mở rộng dựa trên giải pháp PowerShell của Steven Penny, bạn có thể kết hợp nó vào một tệp bó bằng cách gọi powershell.exe như thế này:

powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', 'bar'); }"

Như Ivan Shilo đã nói, điều này sẽ không hoạt động với PowerShell 2, nó yêu cầu PowerShell 3 trở lên và .NET Framework 4.


1
Trên thực tế, điều này đã có sẵn trong .NET 4.5.
qJake

10
Đối với những người (như tôi), người tự hỏi làm thế nào để trích xuất vào thư mục thực tế (thay vì tạo một thư mục mới) chỉ cần đặt tham số đích thành '.', ví dụ:powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.'); }"
Munchkin

Chúng ta có thể sử dụng các lệnh này để tăng nén không? Giống như làm cho nó siêu nén để giảm kích thước tập tin?
Nigel Fds

1
Mục đích của là & {}gì? Với PS5, điều này cũng hoạt động:powershell.exe -nologo -noprofile -command "Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.');"
Roi Danton

@RoiDanton Làm thế nào để sử dụng chuỗi định dạng để xác định src.zip và Dest.zip?
PySaad

161

Kể từ .NET 4.5 , PowerShell có thể làm điều này:

Add-Type -A System.IO.Compression.FileSystem
[IO.Compression.ZipFile]::CreateFromDirectory('foo', 'foo.zip')
[IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', 'bar')

Đối với hai dòng cuối cùng barfoocó thể được thay thế bằng tên mà bạn muốn thư mục có hoặc bất kỳ tên nào của thư mục có sẵn. foo.ziptrong cả hai trường hợp, hoạt động như tệp zip để lưu hoặc giải nén.


17
Đây là phiên bản .NET 4.5.
qJake

Chúng ta có thể sử dụng các lệnh này để tăng nén không? Giống như làm cho nó siêu nén để giảm kích thước tập tin?
Nigel Fds

Tôi đã cài đặt .NET v4.0.30319, v2.0.50727, v1.1.4322, v1.0.3705 qua máy ảo được cài đặt từ đây: developer.microsoft.com/en-us/microsoft-edge/tools/vms và điều này hoạt động. vì vậy tôi đoán bạn không cần .NET 4.5
alpha_989

Đây là giải pháp thiết thực nhất trên các hệ thống hiện đại, điều này sẽ ghi một zip có kích thước trên 2 GB, trong khi tiêu chuẩn "Nén-Lưu trữ" của Powershell sẽ thất bại.
Shukri Adams

135

Nếu bạn đã cài đặt Java, bạn có thể nén vào kho lưu trữ ZIP bằng jarlệnh:

jar -cMf targetArchive.zip sourceDirectory

c = Tạo một tệp lưu trữ mới.

M = Chỉ định rằng không nên thêm tệp kê khai vào kho lưu trữ.

f = Cho biết tên tệp mục tiêu.


3
tuyệt vời, cảm ơn, chỉ là những gì tôi đang tìm kiếm ... FYI - Tôi đã phải loại bỏ trừ char trong DOS ... ví dụ jar CMF target.zip SourceDir
mlo55

3
Không tệ, nhưng bạn cần cài đặt JDK chứ không phải JRE.
pdem 7/07/2016

2
Một giải pháp độc lập, có lẽ là độc lập nhất cho nền tảng này;)
Adrian

YMMD. ý tưởng tuyệt vời. tiết kiệm cho tôi rất nhiều thời gian
gorefest

3
Điều này có được bao phủ bởi "... chỉ sử dụng các khả năng tích hợp sẵn của Windows không?" (nhấn mạnh của tôi)
Peter Mortensen

84

PowerShell 5.0

Từ Microsoft.PowerShell.Archivebạn có thể sử dụng:

Ví dụ:

  • Tạo result.ziptừ toàn bộ Testthư mục:

    Compress-Archive -Path C:\Test -DestinationPath C:\result
    
  • Trích xuất nội dung result.ziptrong Testthư mục được chỉ định :

    Expand-Archive -Path result.zip -DestinationPath C:\Test
    

13
Điều này làm việc tuyệt vời, cảm ơn bạn. Đối với bất kỳ ai kết thúc tại đây, bạn có thể sử dụng powershell Compress-Archive -Path C:\SomeFile.ext -DestinationPath C:\SomeFile.zipngay từ dòng lệnh mà không cần phải tạo tập lệnh (giả sử bạn đã cài đặt Powershell v5, mà bạn có thể thực hiện ít nhất là quay lại Windows 7).
Beems

Hoạt động tuyệt vời, thêm tùy chọn -Force nếu bạn đang dự định chạy lại nó.
Robin Salih

1
@Beems, Cảm ơn bạn! Nhưng tôi nghĩ bạn điên con đường / đích ngược lại?
Ngáp

Điều này hoạt động, nhưng kho lưu trữ được nén khác nhau, điều gì sẽ xảy ra nếu bạn sử dụng thư mục "Trình gửi đến -> nén (đã nén" của windows explorer "Phiên bản powershell lớn hơn và một số chương trình không thể trích xuất
Eric Labashosky

Nén-Lưu trữ có giới hạn tệp tối đa là 2GB trên tệp đầu vào
Sergei Rodionov

37

Đây không phải là ZIP chính xác, nhưng cách duy nhất để nén tệp bằng các công cụ Windows là:

makecab <source> <dest>.cab

Để giải nén:

expand <source>.cab <dest>

Ví dụ nâng cao (từ ss64.com):

Create a self extracting archive containing movie.mov:
C:\> makecab movie.mov "temp.cab"
C:\> copy /b "%windir%\system32\extrac32.exe"+"temp.cab" "movie.exe"
C:\> del /q /f "temp.cab"

Thêm thông tin: makecab , mở rộng , makecab sử dụng nâng cao



34

Sử dụng 7-Zip:

Zip : bạn có một thư mục foovà muốn nén nó vàomyzip.zip

"C:\Program Files\7-Zip\7z.exe" a  -r myzip.zip -w foo -mem=AES256

Giải nén : bạn muốn giải nén nó ( myzip.zip) vào thư mục hiện tại ( ./)

"C:\Program Files\7-Zip\7z.exe" x  myzip.zip  -o./ -y -r

31
Xin lưu ý câu hỏi:without the need to install any 3rd party
Roee Gavirel

16
@RoeeGavirel 7zip phải là một trong những điều đầu tiên bạn cài đặt trên bất kỳ cài đặt Windows nào: P
developerbmw

3
@developerbmw - A. sao vậy? B. Tôi đang xử lý ~ 100 máy đang sản xuất không có 7zip. Để cài đặt, tôi sẽ phải cài đặt DevOps trên tất cả các máy đó và trên tất cả các máy mới sẽ được thêm vào cụm. Tôi thà tránh nó.
Roee Gavirel

1
@Roland: bạn có thể vui lòng trở thành không gian; nó sai ở đâu Điều đó sẽ giúp tất cả.
Monir

1
@Roland: Chỉ cần kiểm tra, cú pháp đang hoạt động tốt. Có thể, bạn đang thử với thư mục "foo" không có trong máy của bạn. Chỉ cần đoán mặc dù.
Monir

9

Tôi đã tìm cách trả lời câu hỏi chính xác này và từ nghiên cứu của tôi, câu trả lời của DiryBoy dường như là chính xác.

Tôi tìm thấy chương trình compact.exe nén các tệp nhưng không tạo tệp nén cao (hoặc bộ tệp). Nó tương tự như tùy chọn bạn nhận được khi nhấp chuột phải vào ký tự ổ đĩa hoặc phân vùng trong Windows. Bạn có tùy chọn để dọn dẹp (xóa tệp tạm thời, v.v.) cũng như nén tệp. Các tệp nén vẫn có thể truy cập được nhưng chỉ được nén để tạo không gian trên ổ đĩa có dung lượng thấp.

Tôi cũng tìm thấy nén.exe mà tôi đã có trên máy tính của tôi. Nó không phải là tự nhiên trên hầu hết các máy tính windows và là một phần của bộ tài nguyên 2003. Nó tạo ra một tệp nén các loại nhưng nó thực sự giống với các tệp từ đĩa thiết lập windows (có dấu gạch dưới là ký tự cuối cùng của phần mở rộng hoặc tên tệp). Và lệnh extract.exe trích xuất các tệp đó.

Tuy nhiên, câu thần chú là, nếu nó có thể được thực hiện tự nhiên thông qua GUI thì có khả năng là cách thực hiện thông qua lô, .vbs hoặc một số loại tập lệnh khác trong dòng lệnh. Vì các cửa sổ đã có tùy chọn 'gửi đến' để tạo tệp zip, tôi biết rằng phải có một cách để thực hiện thông qua dòng lệnh và tôi đã tìm thấy một số tùy chọn.

Đâ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.

/superuser/110991/can-you-zip-a-file-from-the-command-prompt-USE-only-windows-built-in-capabili

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.

/superuser/149361/does-windows-7-have-unzip-at-the-command-line-installed-by-default

Làm thế nào để giải nén một tập tin bằng dòng lệnh?



8

Bạn có thể sử dụng tập lệnh VBScript được gói trong tệp BAT. Mã này hoạt động trên một PATH tương đối.

Không có nhu cầu cho bất kỳ công cụ hoặc phụ thuộc của bên thứ ba. Chỉ cần đặt SOURCEDIROUTPUTZIP.

Tên tệp: ZipUp.bat

echo Set fso = CreateObject("Scripting.FileSystemObject") > _zipup.vbs
echo InputFolder = fso.GetAbsolutePathName(WScript.Arguments.Item(0)) >> _zipup.vbs
echo ZipFile = fso.GetAbsolutePathName(WScript.Arguments.Item(1)) >> _zipup.vbs

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

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

echo ' Keep script waiting until compression is done
echo Do Until objShell.NameSpace( ZipFile ).Items.Count = objShell.NameSpace( InputFolder ).Items.Count >> _zipup.vbs
echo     WScript.Sleep 200 >> _zipup.vbs
echo Loop >> _zipup.vbs

CScript  _zipup.vbs  %SOURCEDIR%  %OUTPUTZIP%

del _zipup.vbs

Ví dụ sử dụng

SET SOURCEDIR=C:\Some\Path
SET OUTPUTZIP=C:\Archive.zip
CALL ZipUp

Ngoài ra, bạn có thể tham số hóa tệp này bằng cách thay thế dòng CScript _zipup.vbs %SOURCEDIR% %OUTPUTZIP%bằng CScript _zipup.vbs %1 %2, trong trường hợp đó, nó có thể được gọi dễ dàng hơn bằng cách gọi đơn giản CALL ZipUp C:\Source\Dir C:\Archive.zip.


Dòng tạo tệp zip ban đầu cần phải được thoát nếu không nó không nằm trong tập lệnh.
cốc

Vâng, đây là cách để đi (như trong câu hỏi Siêu người dùng ).
Peter Mortensen

Tôi đã thêm một phiên bản thoát đúng như một câu trả lời.
fsteff

5

Tôi có một vấn đề với tất cả các giải pháp này.

Chúng không hoàn toàn giống nhau và tất cả chúng đều tạo các tệp có chênh lệch kích thước nhỏ so với RMB --> send to --> compressed (zipped) folderkhi được tạo từ cùng một thư mục nguồn. Sự khác biệt kích thước gần nhất mà tôi có là chênh lệch 300 KB (tập lệnh> thủ công), được thực hiện với:

powershell Compress-Archive -Path C:\sourceFolder -CompressionLevel Fastest -DestinationPath C:\destinationArchive.zip

(Lưu ý -CompressionLevel . Có ba giá trị có thể : Nhanh nhất, Không nén và Tối ưu, (Mặc định: Tối ưu))

Tôi muốn tạo một tệp .bat sẽ tự động nén thư mục plugin WordPress mà tôi đang làm việc, vào một kho lưu trữ .zip để tôi có thể tải nó lên trang web WordPress và kiểm tra plugin.

Nhưng vì một số lý do, nó không hoạt động với bất kỳ thao tác nén tự động nào, nhưng nó hoạt động với nén RMB thủ công, phù thủy tôi thấy thực sự lạ.

Và các tệp .zip được tạo bởi tập lệnh thực sự phá vỡ các plugin WordPress đến mức không thể kích hoạt và chúng cũng không thể bị xóa từ bên trong WordPress. Tôi phải SSH vào "mặt sau" của máy chủ và tự xóa các tệp plugin đã tải lên. Trong khi các tệp do RMB tạo thủ công hoạt động bình thường.


Là gì "WBR""nhân dân tệ" ?
Peter Mortensen

Nhân dân tệ = Nút chuột phải. <wbr> = thẻ HTML cho biết "cơ hội Word BReak" cho trình duyệt (đã bị xóa vì nó không hoạt động).
Sebastian Norr

4

Nếu bạn cần làm điều này như một phần của tập lệnh thì cách tốt nhất là sử dụng Java. Giả sử thư mục bin nằm trong đường dẫn của bạn (trong hầu hết các trường hợp), bạn có thể sử dụng dòng lệnh:

jar xf test.zip

Nếu Java không nằm trên đường dẫn của bạn, hãy tham khảo trực tiếp:

C:\Java\jdk1.6.0_03\bin>jar xf test.zip

3

Nguồn mở là bạn của bạn :-)

Đây là phần giải nén : http://gnuwin32.sourceforge.net/packages/unzip.htm

Cũng có một lệnh ZIP: http://gnuwin32.sourceforge.net/packages/zip.htm

Các mã nhị phân tải là đủ.


Trên Windows 8, nó đưa ra một lỗi: bzip2.dll bị thiếu.
Doug

1
@Doug nó nói rằng bzip2 là một yêu cầu trên trang và có một liên kết để tải xuống
Sam

11
Câu hỏi ban đầu là làm thế nào để sử dụng các lệnh Windows tích hợp chuẩn. Ngoài ra, việc yêu cầu người dùng của bạn cài đặt các giải pháp của bên thứ ba khác nhau là điều không mong muốn vì công cụ hoặc giải pháp của riêng bạn hiện chỉ giới hạn ở những người dùng có quyền quản trị trên máy tính của họ hoặc không quan tâm đến một bộ sưu tập nhỏ phụ thuộc vào hệ thống của họ . Nguồn mở có thể là bạn của bạn, nhưng các gói nguồn mở yêu cầu bạn cài đặt các gói nguồn mở khác yêu cầu bạn cài đặt các gói nguồn mở khác, v.v ... quyết định không phải là bạn của bạn.
Steve Hollasch

SourceForge bị chặn bởi chính sách tường lửa của công việc của tôi :-(
SnookerC

1
Điều này vẫn sử dụng phần mềm sotware của bên thứ ba
Trả lời

3

Đây là phiên bản cập nhật cho câu trả lời được cung cấp bởi @ PodTech.io

Phiên bản này có tất cả các mã vbs được thoát chính xác trong tệp bó. Nó cũng được tạo thành một thường trình con, có thể được gọi bằng một dòng duy nhất từ ​​bất kỳ đâu trong tập lệnh bó của bạn:

:: === Main code:

call :ZipUp "C:\Some\Path" "C:\Archive.zip"


:: === SubRoutines:

:ZipUp
::Arguments: Source_folder, destination_zip
(
    echo:Set fso = CreateObject^("Scripting.FileSystemObject"^)
    echo:InputFolder = fso.GetAbsolutePathName^(WScript.Arguments.Item^(0^)^)
    echo:ZipFile = fso.GetAbsolutePathName^(WScript.Arguments.Item^(1^)^)
    echo:
    echo:' Create empty ZIP file.
    echo:CreateObject^("Scripting.FileSystemObject"^).CreateTextFile^(ZipFile, True^).Write "PK" ^& Chr^(5^) ^& Chr^(6^) ^& String^(18, vbNullChar^)
    echo:
    echo:Set objShell = CreateObject^("Shell.Application"^)
    echo:Set source = objShell.NameSpace^(InputFolder^).Items
    echo:objShell.NameSpace^(ZipFile^).CopyHere^(source^)
    echo:
    echo:' Keep script waiting until compression is done
    echo:Do Until objShell.NameSpace^( ZipFile ^).Items.Count = objShell.NameSpace^( InputFolder ^).Items.Count
    echo:    WScript.Sleep 200
    echo:Loop
)>_zipup.vbs
CScript //Nologo _zipup.vbs "%~1" "%~2"
del _zipup.vbs
goto :eof

2

Bạn nói rằng bạn đang cố gắng làm điều này mà không cần phần mềm của bên thứ ba. Tôi không chắc chắn nếu bạn xem xét phần mềm "bên thứ ba" .NET.

Nhưng bạn có thể tạo tiện ích dòng lệnh của riêng bạn trong .NET. Nó không cần nhiều hơn một vài dòng mã.

Lớp ZipFile


0

Thêm vào câu trả lời và nhận xét của @Jason Duffett , đây là tập lệnh nhận đầu vào và đầu ra (tên tệp và tên thư mục, tương ứng) từ người dùng:

@echo off
set input=%1
set output=%2
powershell.exe "Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('%input%', '%output%');"

Sử dụng:

unzip.bat path\to\file.zip path\to\output\directory

-4

Để nén một tập tin:

C:\> zip -9 -m -o file.dat.zip file.dat
  • -9 nén tối đa
  • -m xóa tập tin gốc sau khi nén thành công
  • -o đặt ngày sửa đổi của tệp zip giống như tệp gốc
  • quá tệ, người ta phải đặt cho nó tên của tệp zip mong muốn thay vì chỉ thêm phần mở rộng .zip vào tên ot tệp để nén

4
hai điều: (1) "zip" không được cung cấp với windows, vì vậy đây có thể là bên thứ 3 mà bạn có. và như câu hỏi của tôi đã đề cập, tôi không thể cài đặt bên thứ 3. (2) Lý do bạn cần cung cấp tên mong muốn là vì nén và tạo tệp (như một thư mục trong một seance) và bạn có thể có nhiều hơn một tệp ở đó.
Roee Gavirel

@RoeeGavirel Trong máy chủ tôi đã tìm thấy tiện ích dòng lệnh zip không có công cụ GUI winzip nào được cài đặt nên tôi đoán công cụ CLI trần đi kèm với Windows. Mặt khác, các tiện ích nén Unix / Linux như nén, bzip2 và gzip tạo một tệp nén có cùng tên của tệp gốc cộng với phần mở rộng (.Z, .bz2 hoặc .gz), nếu bạn không chuyển tên của mong muốn tập tin nén.
Tulains Córdova

-4

Bạn có thể giải nén tệp Windows được nén hoặc nén bằng cách sử dụng lệnh Expand , vd

expand MyFile.zip myFile

9
Tôi đã thử nó, nhưng nó sao chép MyFile.zip vào thư mục myFile,
fhnaseer

Điều này giúp tôi C: \> mở rộng /?
snow6oy

11
Mở rộng chỉ hoạt động với tệp .cab và nó không phù hợp với tệp zip.
ngày

2
Ditto các ý kiến ​​khác ở đây. Expand file.zip filechỉ cần sao chép zip sang tập tin khác mà không cần phần mở rộng. Nó không giải nén ZIP vào một thư mục.
Dave Marley
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.