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