Làm cách nào để nén / giải nén tập tin trong Powershell?


Câu trả lời:


21

DotNetZip sẽ cho phép bạn làm điều này từ PowerShell. Nó không phải là một lớp lót, nhưng thư viện sẽ cho phép bạn viết tập lệnh PowerShell mà bạn cần.

Bạn cũng có thể sử dụng giao diện COM, xem Nén tệp bằng Windows PowerShell sau đó đóng gói Tiện ích thanh bên Windows Vista .

Googling "zip powershell" hoặc "unzip powershell" cũng có thể tạo ra kết quả hữu ích.


+1 Bài viết được liên kết có các Nhiệm vụ hữu ích không giống như câu trả lời được đánh giá cao nhất
Ruben Bartelink

5
-1 để đề xuất tìm kiếm Google. Đây là kết quả StackExchange hàng đầu trong một tìm kiếm Google cho "giải nén powershell"
máy khao khát

154

Đây là cách bạn có thể làm điều đó hoàn toàn từ Powershell mà không cần bất kỳ công cụ bên ngoài nào. Điều này giải nén một tệp có tên test.zip vào thư mục làm việc hiện tại:

$shell_app=new-object -com shell.application
$filename = "test.zip"
$zip_file = $shell_app.namespace((Get-Location).Path + "\$filename")
$destination = $shell_app.namespace((Get-Location).Path)
$destination.Copyhere($zip_file.items())

26
sử dụng $ Destination.Copyhere ($ zip_file.items (), 0x10) để ghi đè các tệp hiện có. 0x4 ẩn hộp thoại và 0x14 kết hợp những điều này và ghi đè và ẩn hộp thoại.
Peter

3
Các dòng $destination.Copyhere($zip_file.items())không giải nén thực tế.
Jonathan Allen

2
Bạn có thể phân chia phần trên thành một hàm, nếu bạn muốn: function unzip($filename) { if (!(test-path $filename)) { throw "$filename does not exist" } $shell = new-object -com shell.application $shell.namespace($pwd.path).copyhere($shell.namespace((join-path $pwd $filename)).items()) }
James Holwell

6
Đây phải là câu trả lời được chấp nhận.
tugberk

2
Điều này không thành công với tôi khi tệp zip chỉ chứa một thư mục (các mục trống)
James Woolfenden

56

Bây giờ trong .NET Framework 4.5, có một lớp ZipFile mà bạn có thể sử dụng như thế này:

[System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
[System.IO.Compression.ZipFile]::ExtractToDirectory($sourceFile, $targetFolder)

1
Điều này sẽ rất tuyệt nếu có một phương pháp đơn giản để ExtractToDirectory và một tùy chọn để ghi đè lên tất cả các tệp hiện có.
James Dunne

1
Điều này hoạt động với .NET 4.5. Tuy nhiên, bạn cũng cần Powershell V3.
DalSoft

3
Tải lắp ráp với Add-Type, ví dụ: Add-Type -AssuggingName System.IO.Compression.FileSystem
Mike

2
@JamesDunne - Nếu bạn không có các tệp khác bạn cần lưu giữ, có thể sử dụng 'Xóa-Mục -Recurse $ TargetFolder'. Nếu không, những gì bạn muốn có thể được thực hiện, nhưng nó sẽ không tầm thường. Bạn sẽ cần mở zip để đọc, sau đó đi bộ zip, xóa bất kỳ đối tượng mục tiêu trước đó và giải nén cái mới. May mắn cho tôi, giải pháp dễ dàng làm việc. ;)
Mike

3
Được cảnh báo rằng các vị trí tệp tương đối sẽ sử dụng thư mục hiện tại .NET , không phải thư mục PowerShell. Xem tại đây . Có lẽ tốt hơn chỉ (Resolve-Path $someDir).Pathlà tranh luận.
jpmc26

18

Bạn có thể muốn xem Phần mở rộng cộng đồng PowerShell (PSCX) có các lệnh ghép ngắn dành riêng cho việc này.


1
+1 PSCX là một tập hợp các lệnh ghép bổ trợ tuyệt vời - Tôi chỉ ước mình có thể chọn và chọn thêm những cái tôi muốn và cái nào tôi không muốn. Nó dường như đang thay đổi rất nhiều trong trường hợp Powershell của tôi ....
marc_s

Tôi đã gặp phải điều này bởi vì tôi thực sự muốn tự động hóa việc cài đặt PSCX nếu tôi có thể cho một số đồng nghiệp. Hãy thử ngay bây giờ để xem tôi gặp phải vấn đề gì
jcolebrand

16

Tôi biết đây là một câu hỏi rất cũ, nhưng tôi chỉ thấy nó được liên kết trên Twitter trên hình tôi sẽ đăng một câu trả lời hiện tại.

PowerShell 5, hiện có sẵn trên Windows 10 hoặc thông qua Bản xem trước sản xuất Windows Management Framework 5 , đi kèm với hai lệnh ghép ngắn tích hợp để 'nén' và 'giải nén':


3
Đó là một điều tốt để cung cấp thông tin mới cho các câu hỏi cũ. ;) +1
jpmc26

5

Tôi tìm thấy giải pháp đơn giản nhất để chỉ sử dụng các tệp nhị phân thông tin mà tôi đã sử dụng trong nhiều năm và sử dụng trong môi trường UNIX.

PS> zip -9r ../test.zip * 
PS> cd .. 
PS> unzip -t test.zip Archive:  test.zip
    testing: LinqRepository/          OK
    testing: LinqRepository/ApplicationService.cs   OK
    testing: LinqRepository/bin/      OK 
... 
No errors detected in compressed data of test.zip.

Sẽ rất khó khăn để đặt một trình bao bọc quyền hạn xung quanh đầu ra văn bản nhưng trong thực tế tôi không bao giờ cần điều đó vì vậy tôi không bận tâm.

http://www.info-zip.org/


5

Tôi cũng thích Info-ZIP (công cụ Zip được tìm thấy trong hầu hết các tiện ích Zip khác) và 7-Zip , một ứng dụng yêu thích khác có cả GUI và tiện ích Zip dòng lệnh. Vấn đề là, có một số tiện ích dòng lệnh tốt sẽ hoạt động cho hầu hết các tác vụ PowerShell.

Có một số thủ thuật để chạy các tiện ích dòng lệnh chưa được xây dựng với PowerShell:

  • Chạy một tệp thực thi bắt đầu bằng một số trong tên, mở đầu nó bằng Ampersand (&).

    & 7zip.exe

  • Gói từng mã thông báo, tiện ích dự kiến ​​sẽ nhìn thấy từ dòng lệnh, trong dấu ngoặc kép.

    & "c: \ path với dấu cách

Thử đi:

zip filename.zip (Get-ChildItem somepath\*)

Hoặc thậm chí:

zip filename.zip (Get-Content ListOfFiles.txt)

2

James Holwell Tôi thích câu trả lời của bạn nhưng tôi đã mở rộng nó ra một chút

# Example
#unzip "myZip.zip" "C:\Users\me\Desktop" "c:\mylocation"
function unzip($fileName, $sourcePath, $destinationPath)
{
    $shell = new-object -com shell.application
    if (!(Test-Path "$sourcePath\$fileName"))
    {
        throw "$sourcePath\$fileName does not exist" 
    }
    New-Item -ItemType Directory -Force -Path $destinationPath -WarningAction SilentlyContinue
    $shell.namespace($destinationPath).copyhere($shell.namespace("$sourcePath\$fileName").items()) 
}



0

Tôi đã tạo một mô-đun tương thích PowerShell 2.0 sử dụng các lệnh hệ điều hành Windows gốc để nén và giải nén các tệp một cách đồng bộ. Điều này hoạt động trên các HĐH cũ hơn, như Windows XP và không yêu cầu .Net 4.5 hoặc bất kỳ công cụ bên ngoài nào khác. Các chức năng cũng sẽ chặn thực thi tập lệnh cho đến khi tất cả các tệp được nén / giải nén. Bạn có thể tìm thêm thông tin và mô-đun trên blog của tôi ở đây .

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.