Computer >> คอมพิวเตอร์ >  >> ระบบ >> Windows Server

วิธีสร้างไฟล์ ZIP และแตกไฟล์ด้วย PowerShell

คุณสามารถใช้คุณสมบัติของ 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

วิธีสร้างไฟล์ ZIP และแตกไฟล์ด้วย PowerShell

มาดูตัวอย่างการใช้ 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

วิธีสร้างไฟล์ ZIP และแตกไฟล์ด้วย PowerShell

คุณสามารถซิปเนื้อหาทั้งหมดจากหลาย ๆ โฟลเดอร์ได้ (รวมถึงไฟล์ทั้งหมดและโฟลเดอร์ที่ซ้อนกัน):

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

คำแนะนำ เนื่องจากโมดูล Microsoft.PowerShell.Archive ใช้คลาส System.IO.Compression.ZipArchive คุณจึงไม่สามารถบีบอัดไฟล์ที่มีขนาดใหญ่กว่า 2 GB ได้ (เนื่องจากมีข้อจำกัดของ API พื้นฐาน) เมื่อพยายามบีบอัดไฟล์ขนาดใหญ่ขึ้น ข้อผิดพลาดจะปรากฏขึ้น:

วิธีสร้างไฟล์ ZIP และแตกไฟล์ด้วย 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

จะแตกไฟล์ 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

วิธีสร้างไฟล์ ZIP และแตกไฟล์ด้วย PowerShell

ข้อเสียของโมดูล Microsoft.PowerShell.Archive:

  • คุณไม่สามารถดูเนื้อหาของไฟล์เก็บถาวรโดยไม่แตกไฟล์ได้
  • คุณไม่สามารถแยกไฟล์บางไฟล์ออกจากไฟล์เก็บถาวรได้ (คุณจะต้องแตกไฟล์เก็บถาวรทั้งหมด)
  • คุณไม่สามารถใช้รูปแบบไฟล์เก็บถาวรอื่นได้ ยกเว้น zip;
  • คุณจะไม่สามารถปกป้องไฟล์ ZIP ด้วยรหัสผ่านได้
ในกรณีที่ซับซ้อนกว่านี้ คุณต้องใช้เครื่องมือของบริษัทอื่นเพื่อดำเนินการเก็บถาวรในสคริปต์ PowerShell ของคุณ ตัวอย่างเช่น 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 เวอร์ชัน <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

ในการอัปเดตไฟล์ 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 และแตกไฟล์ด้วย PowerShell

หรือคุณสามารถแสดงเนื้อหาของไฟล์ 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 และแตกไฟล์ด้วย PowerShell

ในการแตกไฟล์ ZIP ไปยังโฟลเดอร์ C:\Logs ให้ใช้คำสั่งต่อไปนี้:

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