คุณสามารถใช้คุณสมบัติของ PowerShell เพื่อสร้างไฟล์ ZIP และแตกไฟล์ได้ ใน PowerShell 5.0 (เวอร์ชัน PowerShell นี้ได้รับการติดตั้งโดยค่าเริ่มต้นใน Windows 10) โมดูลแยกต่างหาก Microsoft.PowerShell.Archive สามารถใช้ได้. ใน Windows เวอร์ชันเก่า คุณสามารถใช้ ZipFile คลาสจาก .NET Framework สำหรับเก็บถาวร
มีเพียงสอง cmdlet ในโมดูล Microsoft.PowerShell.Archive (C:\Windows\System32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive):
- บีบอัดไฟล์เก็บถาวร
- ขยายที่เก็บถาวร
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
มาดูตัวอย่างการใช้ cmdlet เหล่านี้เพื่อสร้างและแยกไฟล์ ZIP ในสคริปต์ PowerShell ของคุณ
PowerShell:สร้างไฟล์ ZIP ด้วยการบีบอัดไฟล์เก็บถาวร
คำสั่ง Compress-Archive มีรูปแบบดังนี้:
Compress-Archive [-Path] String[] [-DestinationPath] String [-CompressionLevel String ] [-Update]
- The เส้นทาง พารามิเตอร์ใช้เพื่อระบุพาธไปยังไฟล์หรือโฟลเดอร์ที่จะเก็บถาวร
- เส้นทางปลายทาง – ระบุเส้นทางไปยังไฟล์ ZIP;
- ระดับการบีบอัด – ตั้งค่าระดับการบีบอัด (
NoCompression
,Optimal
หรือFastest
); - อัปเดต – ให้คุณเพิ่ม (อัปเดต) ไฟล์ในไฟล์ ZIP ที่มีอยู่ได้
- กำลัง – หากมีไฟล์เก็บถาวรที่มีชื่อที่ระบุอยู่แล้ว ไฟล์นั้นจะถูกเขียนทับ
- เหมาะสมที่สุด — การปรับให้เหมาะสมตามระดับการบีบอัด;
- เร็วที่สุด — การเพิ่มประสิทธิภาพตามเวลาที่ใช้;
- ไม่มีการบีบอัด — โดยไม่มีการบีบอัด
ควรใช้ตัวเลือก NoCompression เมื่อเก็บถาวรไฟล์ที่บีบอัดแล้ว (jpg, msi, mp3 เป็นต้น) ลงในไฟล์ ZIP ไฟล์เดียว ในกรณีนี้ Windows จะไม่เสียเวลากับ CPU ในการบีบอัด
หากต้องการซิปไฟล์เดียว ให้เรียกใช้:
Compress-Archive -Path "C:\Logs\WindowsUpdate.log" -DestinationPath C:\Archive\updatelog.zip -CompressionLevel Optimal
คุณสามารถซิปเนื้อหาทั้งหมดจากหลาย ๆ โฟลเดอร์ได้ (รวมถึงไฟล์ทั้งหมดและโฟลเดอร์ที่ซ้อนกัน):
Compress-Archive -Path C:\Logs\,C:\Logs2\ -DestinationPath C:\Archive\logs-all.zip -CompressionLevel Optimal
คุณสามารถเพิ่มไฟล์ ZIP ได้เฉพาะไฟล์ที่มีมาสก์เฉพาะ ตัวอย่างเช่น คำสั่งต่อไปนี้จะซิปเฉพาะไฟล์ *.txt
Compress-Archive -Path C:\Logs\*.txt -DestinationPath C:\Archive\logs-txt.zip –CompressionLevel Fastest
สามารถใช้ตัวกรองที่ซับซ้อนมากขึ้นกับ Get-ChildItem cmdlet ตัวอย่างเช่น สคริปต์ต่อไปนี้จะช่วยให้คุณค้นหาไฟล์ที่ใหญ่ที่สุด 10 ไฟล์ที่มีนามสกุล *.docx หรือ *.xlsx บนดิสก์และเพิ่มลงในไฟล์เก็บถาวร:
Get-ChildItem c:\share\ITdept -Include *.xlsx –Recurse| sort -descending -property length | select -first 10 |Compress-Archive -DestinationPath C:\backup\itdeptdocs.zip
หากต้องการเพิ่มไฟล์ใหม่ในไฟล์ zip ที่มีอยู่ ให้ใช้ อัปเดต คีย์:
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
จะแตกไฟล์ ZIP ด้วย Expand-Archive ได้อย่างไร
คุณสามารถใช้ Expand-Archive cmdlet เพื่อคลายซิปไฟล์ ZIP ไวยากรณ์สำหรับ cmdlet นั้นคล้ายกัน:
Expand-Archive [-Path] String [-DestinationPath] String [-Force] [-Confirm]
ตัวอย่างเช่น ในการแตกไฟล์ ZIP ที่เราสร้างไว้ก่อนหน้านี้ลงในโฟลเดอร์ที่ระบุและเขียนทับไฟล์:
Expand-Archive -Path C:\archive\logs-all.zip -DestinationPath c:\logs -Force
ข้อเสียของโมดูล Microsoft.PowerShell.Archive:
- คุณไม่สามารถดูเนื้อหาของไฟล์เก็บถาวรโดยไม่แตกไฟล์ได้
- คุณไม่สามารถแยกไฟล์บางไฟล์ออกจากไฟล์เก็บถาวรได้ (คุณจะต้องแตกไฟล์เก็บถาวรทั้งหมด)
- คุณไม่สามารถใช้รูปแบบไฟล์เก็บถาวรอื่นได้ ยกเว้น zip;
- คุณจะไม่สามารถปกป้องไฟล์ ZIP ด้วยรหัสผ่านได้
คุณสามารถติดตั้งโมดูล 7Zip4Powershell และแตกไฟล์ zip ที่ป้องกันด้วยรหัสผ่านได้ดังนี้:
Install-Module -Name 7Zip4Powershell
Expand-7Zip -ArchiveFileName C:\Archive\Logs.zip -Password "p@ssd0rw" -TargetPath C:\Share\Logs
การทำงานกับไฟล์บีบอัดด้วย PowerShell ZipFile Class
ใน Windows เวอร์ชันก่อนหน้า (ก่อน Windows 10 หรือ Windows Server 2016 ที่มี PowerShell เวอร์ชัน <5.0 (หากคุณไม่สามารถอัปเกรดเวอร์ชัน PowerShell ได้) คุณสามารถใช้คลาส ZipFile แยกต่างหาก (จาก NET Framework 4.5) เพื่อสร้างไฟล์ zip ได้
ขั้นแรก โหลดคลาสลงในเซสชัน PowerShell ของคุณ:
Add-Type -AssemblyName "System.IO.Compression.FileSystem"
หากต้องการเก็บโฟลเดอร์ถาวร ให้ใช้สคริปต์ PS ดังนี้:
$SourceFolder = 'C:\Logs'
$ZipFileName = 'C:\PS\logs.zip'
[IO.Compression.ZipFile]::CreateFromDirectory($SourceFolder, $ZipFileName)
ในการอัปเดตไฟล์ ZIP และกำหนดอัตราการบีบอัด ให้ใช้รหัส PowerShell ต่อไปนี้:
$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()
คำสั่งใช้สำหรับปิดไฟล์ zip คุณสามารถระบุเนื้อหาของไฟล์ ZIP ได้:
[System.IO.Compression.ZipFile]::OpenRead($zipFileName).Entries.Name
หรือคุณสามารถแสดงเนื้อหาของไฟล์ zip เป็นตาราง Out-GridView พร้อมข้อมูลเพิ่มเติม (ขนาดของไฟล์บีบอัด/ไม่บีบอัด เวลาเขียนล่าสุด ฯลฯ):
$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()
ในการแตกไฟล์ ZIP ไปยังโฟลเดอร์ C:\Logs ให้ใช้คำสั่งต่อไปนี้:
$SourceZipFile = 'C:\PS\logs.zip'
$TargetFolder = 'C:\Logs'
[IO.Compression.ZipFile]::ExtractToDirectory($SourceZipFile, $TargetFolder)