ค้นหาเว็บไซต์

วิธีสร้างไฟล์เก็บถาวร 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 1.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]
  • พารามิเตอร์ เส้นทาง ใช้เพื่อระบุเส้นทางไปยังไฟล์หรือโฟลเดอร์ที่จะเก็บถาวร

  • DestinationPath - ระบุเส้นทางไปยังไฟล์ ZIP

  • CompressionLevel - กำหนดระดับการบีบอัด (

    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 เนื้อหาทั้งหมดของหลายโฟลเดอร์ (รวมถึงไฟล์ทั้งหมดและโฟลเดอร์ที่ซ้อนกัน):

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 พื้นฐาน) เมื่อพยายามบีบอัดไฟล์ขนาดใหญ่ขึ้น ข้อผิดพลาดจะปรากฏขึ้น:

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 ได้อย่างไร

คุณสามารถใช้ cmdlet Expand-Archive เพื่อคลายซิปไฟล์ 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 ด้วยรหัสผ่านได้

ในกรณีที่ซับซ้อนมากขึ้น คุณต้องใช้เครื่องมือของบริษัทอื่นเพื่อทำการเก็บถาวรในสคริปต์ 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 ต่อไปนี้:

$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)

บทความที่เกี่ยวข้อง