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
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ặcFastest
); - 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 đè.
- 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
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
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
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
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.
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)
Để 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
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()
Để 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)