Computer >> Máy Tính >  >> Hệ thống >> máy chủ Windows

Làm cách nào để tạo tệp lưu trữ ZIP và giải nén tệp bằng PowerShell?

Bạn có thể sử dụng các tính năng của PowerShell để tạo lưu trữ ZIP và giải nén chúng. Trong PowerShell 5.0 (phiên bản PowerShell này được cài đặt theo mặc định trên Windows 10), một mô-đun riêng biệt Microsoft.PowerShell.Archive có sẵn. Trên các phiên bản Windows cũ hơn, bạn có thể sử dụng ZipFile từ .NET Framework để lưu trữ.

Chỉ có hai lệnh ghép ngắn trong mô-đun Microsoft.PowerShell.Archive (C:\ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Modules \ Microsoft.PowerShell.Archive):

  • Nén-Lưu trữ
  • Mở rộng-Lưu trữ

Get-Command -Module Microsoft.PowerShell.Archive | Format-Table -AutoSize

CommandType Name             Version Source
----------- ----             ------- ------
Function    Compress-Archive 1.0.1.0 Microsoft.PowerShell.Archive
Function    Expand-Archive   1.0.1.0 Microsoft.PowerShell.Archive

Làm cách nào để tạo tệp lưu trữ ZIP và giải nén tệp bằng PowerShell?

Hãy xem các ví dụ về cách sử dụng các lệnh ghép ngắn này để tạo và trích xuất các tệp nén ZIP trong các tập lệnh PowerShell của bạn.

PowerShell:Tạo Lưu trữ ZIP bằng Nén-Lưu trữ

Lệnh Nén-Lưu trữ có cú pháp sau:

Compress-Archive [-Path] String[] [-DestinationPath] String  [-CompressionLevel String ] [-Update]

  • Đường dẫn tham số được sử dụng để chỉ định đường dẫn đến các tệp hoặc thư mục sẽ được lưu trữ;
  • DestinationPath - chỉ định đường dẫn đến tệp ZIP;
  • CompressionLevel - đặt mức nén (NoCompression , Optimal hoặc Fastest );
  • Cập nhật - cho phép bạn thêm (cập nhật) tệp trong kho lưu trữ ZIP hiện có;
  • Buộc - nếu tệp lưu trữ có tên được chỉ định đã tồn tại, tệp đó sẽ bị ghi đè.
Mẹo . Tùy chọn mức nén:

  • Tối ưu - tối ưu hóa theo mức độ nén;
  • Nhanh nhất - tối ưu hóa theo thời gian thực hiện;
  • NoCompression - không có bất kỳ nén nào.

Tùy chọn NoCompression sẽ được sử dụng khi lưu trữ các tệp đã được nén (jpg, msi, mp3, v.v.) thành một tệp ZIP. Trong trường hợp này, Windows sẽ không lãng phí thời gian của CPU khi nén chúng.

Để nén một tệp, hãy chạy:

Compress-Archive -Path "C:\Logs\WindowsUpdate.log" -DestinationPath C:\Archive\updatelog.zip -CompressionLevel Optimal

Làm cách nào để tạo tệp lưu trữ ZIP và giải nén tệp bằng PowerShell?

Bạn có thể nén toàn bộ nội dung của nhiều thư mục (bao gồm tất cả các tệp và thư mục lồng nhau):

Compress-Archive -Path C:\Logs\,C:\Logs2\ -DestinationPath C:\Archive\logs-all.zip -CompressionLevel Optimal

Để thêm nhiều tệp hoặc thư mục vào kho lưu trữ, hãy phân tách tên của chúng bằng dấu phẩy.

Bạn chỉ có thể thêm vào tệp lưu trữ ZIP với một mặt nạ cụ thể. Ví dụ:lệnh sau sẽ chỉ nén các tệp * .txt.

Compress-Archive -Path C:\Logs\*.txt -DestinationPath C:\Archive\logs-txt.zip –CompressionLevel Fastest

Các bộ lọc phức tạp hơn có thể được sử dụng với lệnh ghép ngắn Get-ChildItem. Ví dụ:tập lệnh sau sẽ cho phép bạn tìm 10 tệp lớn nhất hàng đầu có phần mở rộng * .docx hoặc * .xlsx trên đĩa và thêm chúng vào kho lưu trữ:

Get-ChildItem c:\share\ITdept -Include *.xlsx –Recurse| sort -descending -property length | select -first 10 |Compress-Archive -DestinationPath C:\backup\itdeptdocs.zip

Để thêm tệp mới vào kho lưu trữ zip hiện có, hãy sử dụng Cập nhật khóa:

Compress-Archive -Path C:\Logs\,C:\logs2\ –Update -DestinationPath C:\Archive\logs-txt.zip

Gợi ý .Vì mô-đun Microsoft.PowerShell.Archive sử dụng lớp System.IO.Compression.ZipArchive, bạn không thể nén tệp lớn hơn 2 GB (vì có giới hạn của API cơ bản). Khi cố gắng nén một tệp lớn hơn, lỗi sẽ xuất hiện:

Làm cách nào để tạo tệp lưu trữ ZIP và giải nén tệp bằng PowerShell?

Exception calling "Write" with "3" argument(s): "Stream was too long."
At  C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:805
char:29
+ ...                     $destStream.Write($buffer, 0, $numberOfBytesRead)
+                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : IOException

Làm cách nào để giải nén tệp ZIP bằng tính năng Mở rộng-Lưu trữ?

Bạn có thể sử dụng lệnh ghép ngắn Mở rộng-Lưu trữ để giải nén các tệp ZIP. Cú pháp cho lệnh ghép ngắn tương tự:

Expand-Archive [-Path] String [-DestinationPath] String [-Force]  [-Confirm]

Ví dụ:để giải nén tệp nén ZIP mà chúng tôi đã tạo trước đó vào thư mục được chỉ định và ghi đè lên các tệp:

Expand-Archive -Path C:\archive\logs-all.zip  -DestinationPath c:\logs -Force

Làm cách nào để tạo tệp lưu trữ ZIP và giải nén tệp bằng PowerShell?

Nhược điểm của mô-đun Microsoft.PowerShell.Archive:

  • Bạn không thể xem nội dung của kho lưu trữ mà không giải nén nó;
  • Bạn không thể giải nén một số tệp từ kho lưu trữ (bạn sẽ phải giải nén toàn bộ tệp lưu trữ);
  • Bạn không thể sử dụng các định dạng lưu trữ khác, ngoại trừ zip;
  • Bạn sẽ không thể bảo vệ tệp lưu trữ ZIP bằng mật khẩu.
Trong các trường hợp phức tạp hơn, bạn cần sử dụng các công cụ của bên thứ ba để thực hiện lưu trữ trong các tập lệnh PowerShell của mình. Ví dụ: 7zip hoặc 7Zip4Powershell mô-đun.

Bạn có thể cài đặt mô-đun 7Zip4Powershell và giải nén tệp zip được bảo vệ bằng mật khẩu như sau:

Install-Module -Name 7Zip4Powershell
Expand-7Zip -ArchiveFileName C:\Archive\Logs.zip -Password "p@ssd0rw" -TargetPath C:\Share\Logs

Làm việc với tệp nén bằng PowerShell ZipFile Class

Trong phiên bản Windows cũ hơn (trước Windows 10 hoặc Windows Server 2016 với phiên bản PowerShell <5.0 (nếu bạn không thể nâng cấp phiên bản PowerShell), bạn có thể sử dụng một lớp ZipFile riêng biệt (từ NET Framework 4.5) để tạo tệp nén zip.

Đầu tiên, tải lớp vào phiên PowerShell của bạn:

Add-Type -AssemblyName "System.IO.Compression.FileSystem"

Để lưu trữ một thư mục, hãy sử dụng tập lệnh PS như sau:

$SourceFolder = 'C:\Logs'
$ZipFileName = 'C:\PS\logs.zip'
[IO.Compression.ZipFile]::CreateFromDirectory($SourceFolder, $ZipFileName)

Làm cách nào để tạo tệp lưu trữ ZIP và giải nén tệp bằng PowerShell?

Để cập nhật kho lưu trữ ZIP và đặt tỷ lệ nén, hãy sử dụng mã PowerShell sau:

$addfile = ‘C:\temp\new.log’
$compressionLevel = [System.IO.Compression.CompressionLevel]::Fastest
$zip = [System.IO.Compression.ZipFile]::Open($zipFileName, 'update')[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zip, $addfile, (Split-Path $addfile -Leaf), $compressionLevel)
$zip.Dispose()

$zip.Dispose() được sử dụng để đóng tệp zip.

Bạn có thể liệt kê nội dung của kho lưu trữ ZIP:

[System.IO.Compression.ZipFile]::OpenRead($zipFileName).Entries.Name

Làm cách nào để tạo tệp lưu trữ ZIP và giải nén tệp bằng PowerShell?

Hoặc bạn có thể hiển thị nội dung của kho lưu trữ zip dưới dạng bảng Out-GridView với thông tin bổ sung (kích thước tệp nén / không nén, thời gian ghi lần cuối, v.v.):

$ZipFileName = "C:\PS\logs1.zip"
$Stream = New-Object IO.FileStream($ZipFileName , [IO.FileMode]::Open)
$ZipArchive = New-Object IO.Compression.ZipArchive($Stream)
$ZipArchive.Entries |
Select-Object Name,
@{Name="File Path";Expression={$_.FullName}},
@{Name="Compressed Size (KB)";Expression={"{0:N2}" -f($_.CompressedLength/1kb)}},
@{Name="UnCompressed Size (KB)";Expression={"{0:N2}" -f($_.Length/1kb)}},
@{Name="File Date";Expression={$_.LastWriteTime}} | Out-GridView
$ZipArchive.Dispose()
$Stream.Close()
$Stream.Dispose()

Làm cách nào để tạo tệp lưu trữ ZIP và giải nén tệp bằng PowerShell?

Để giải nén tệp ZIP vào thư mục C:\ Logs, hãy sử dụng các lệnh sau:

$SourceZipFile = 'C:\PS\logs.zip'
$TargetFolder = 'C:\Logs'
[IO.Compression.ZipFile]::ExtractToDirectory($SourceZipFile, $TargetFolder)