วิธีการ zip / unzip ไฟล์ใน Powershell


คำตอบ:


21

DotNetZipจะอนุญาตให้คุณทำสิ่งนี้จาก PowerShell ไม่ใช่ซับเดียว แต่ไลบรารี่จะอนุญาตให้คุณเขียนสคริปต์ PowerShell ที่คุณต้องการ

นอกจากนี้คุณยังสามารถใช้อินเตอร์เฟซ COM ให้ดูไฟล์บีบอัดด้วย Windows PowerShell แล้วแพ็คเกจ Vista Gadget

Googling "zip powershell" หรือ "unzip powershell" อาจทำให้เกิดผลลัพธ์ที่มีประโยชน์


+1 บทความที่เชื่อมโยงมีภารกิจที่มีประโยชน์ซึ่งแตกต่างจากคำตอบ upvoted ที่สุด
Ruben Bartelink

5
-1 สำหรับการแนะนำการค้นหาโดย Google นี่คือผลลัพธ์ StackExchange อันดับต้น ๆ ในการค้นหาของ Google สำหรับ "unzip powershell"
machine yearning เครื่อง

154

นี่คือวิธีที่คุณสามารถทำได้อย่างหมดจดจาก Powershell โดยไม่มีเครื่องมือภายนอก ซึ่งทำการคลายซิปไฟล์ที่เรียกว่า test.zip ไปยังไดเรกทอรีการทำงานปัจจุบัน:

$shell_app=new-object -com shell.application
$filename = "test.zip"
$zip_file = $shell_app.namespace((Get-Location).Path + "\$filename")
$destination = $shell_app.namespace((Get-Location).Path)
$destination.Copyhere($zip_file.items())

26
ใช้ $ destination.Copyhere ($ zip_file.items (), 0x10) สำหรับการเขียนทับไฟล์ที่มีอยู่ 0x4 ซ่อนกล่องโต้ตอบและ 0x14 รวมสิ่งเหล่านี้และเขียนทับและซ่อนกล่องโต้ตอบ
ปีเตอร์

3
บรรทัด$destination.Copyhere($zip_file.items())ทำการเปิดเครื่องรูดจริง
Jonathan Allen

2
คุณสามารถพัสดุดังกล่าวข้างต้นในการทำงานถ้าคุณต้องการ: function unzip($filename) { if (!(test-path $filename)) { throw "$filename does not exist" } $shell = new-object -com shell.application $shell.namespace($pwd.path).copyhere($shell.namespace((join-path $pwd $filename)).items()) }
เจมส์ฮ็อ

6
นี่ควรเป็นคำตอบที่ยอมรับได้
tugberk

2
นี้ล้มเหลวสำหรับฉันเมื่อไฟล์ซิปมีเพียงโฟลเดอร์ (รายการที่เป็นที่ว่างเปล่า)
เจมส์ Woolfenden

56

ตอนนี้ใน. NET Framework 4.5 มีคลาสZipFileที่คุณสามารถใช้ดังนี้

[System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
[System.IO.Compression.ZipFile]::ExtractToDirectory($sourceFile, $targetFolder)

1
สิ่งนี้จะดีมากถ้ามีวิธีง่าย ๆ ในการ ExtractToDirectory และตัวเลือกในการเขียนทับไฟล์ที่มีอยู่ทั้งหมด
James Dunne

1
สิ่งนี้ใช้ได้กับ. NET 4.5 อย่างไรก็ตามคุณต้องใช้ Powershell V3 ด้วย
DalSoft

3
โหลดแอสเซมบลีด้วย Add-Type ตัวอย่างเช่น: Add-Type -AssemblyName System.IO.Compression.FileSystem
Mike

2
@JamesDunne - หากคุณไม่มีไฟล์อื่น ๆ ที่คุณต้องการเก็บไว้ให้ใช้ 'ลบรายการ - ถอนเงิน $ TargetFolder' มิฉะนั้นสิ่งที่คุณต้องการสามารถทำได้ แต่มันจะไม่ไร้สาระ คุณจะต้องเปิด zip เพื่ออ่านแล้วเดิน zip ลบวัตถุเป้าหมายก่อนหน้าและเปิดใหม่ โชคดีสำหรับฉันโซลูชันที่ง่ายใช้งานได้ ;)
Mike

3
ได้รับการเตือนว่าที่ตั้งไฟล์ที่เกี่ยวข้องจะใช้ไดเรกทอรีปัจจุบันของNET ไม่ใช่ PowerShell ดูที่นี่ มันอาจจะดีกว่าเพียงแค่(Resolve-Path $someDir).Pathข้อโต้แย้ง
jpmc26

18

คุณอาจต้องการตรวจสอบส่วนขยายชุมชน PowerShell (PSCX)ซึ่งมี cmdlets เฉพาะสำหรับสิ่งนี้


1
+1 PSCX เป็นชุด Add-on cmdlets ที่ยอดเยี่ยม - ฉันแค่หวังว่าฉันจะสามารถเลือกและเลือกสิ่งที่ฉันต้องการได้ มันดูเหมือนว่าจะมีการเปลี่ยนแปลงเป็นจำนวนมากทั้งในกรณี Powershell ของฉัน ....
marc_s

ฉันเจอสิ่งนี้เพราะฉันต้องการติดตั้ง PSCX โดยอัตโนมัติถ้าฉันสามารถทำได้สำหรับเพื่อนร่วมงานบางคน ลองตอนนี้เพื่อดูว่าฉันพบปัญหาประเภทใด
jcolebrand

16

ฉันรู้ว่านี่เป็นคำถามที่เก่ามาก แต่ฉันเพิ่งเห็นมันเชื่อมโยงบน Twitter เมื่อคิดว่าฉันจะโพสต์คำตอบปัจจุบัน

PowerShell 5 ซึ่งมีให้บริการบน Windows 10 หรือผ่านทางWindows Management Framework 5 Production Previewมาพร้อมกับ cmdlet ในตัวสองตัวสำหรับ 'zipping' และ 'unzipping':


3
เป็นสิ่งที่ดีที่จะให้ข้อมูลใหม่กับคำถามเก่า ;) +1
jpmc26

5

ฉันพบทางออกที่ง่ายที่สุดเพียงแค่ใช้ไบนารี infozip ที่ฉันใช้มานานหลายปีและใช้ในสภาพแวดล้อม UNIX

PS> zip -9r ../test.zip * 
PS> cd .. 
PS> unzip -t test.zip Archive:  test.zip
    testing: LinqRepository/          OK
    testing: LinqRepository/ApplicationService.cs   OK
    testing: LinqRepository/bin/      OK 
... 
No errors detected in compressed data of test.zip.

มันจะตรงไปตรงมาที่จะใส่เสื้อคลุมทรงพลังรอบ ๆ ข้อความ แต่ในทางปฏิบัติฉันไม่เคยต้องการมันเลยไม่ได้ใส่ใจ

http://www.info-zip.org/


5

ฉันยังชอบInfo-ZIP (เอ็นจิ้น Zip ที่พบในยูทิลิตี้ Zip อื่น ๆ ) และ7-Zipซึ่งเป็นรายการโปรดอีกรายการหนึ่งที่มีทั้งยูทิลิตี้ GUI และบรรทัดคำสั่ง Zip ประเด็นก็คือมียูทิลิตีบรรทัดคำสั่งที่ดีที่จะใช้กับงาน PowerShell ส่วนใหญ่

มีเทคนิคบางประการในการเรียกใช้โปรแกรมอรรถประโยชน์บรรทัดคำสั่งที่ไม่ได้สร้างขึ้นด้วย PowerShell:

  • การเรียกใช้โปรแกรมเรียกทำงานที่เริ่มต้นด้วยตัวเลขในชื่อนำหน้าด้วยเครื่องหมายและ (&)

    และ 7zip.exe

  • ล้อมแต่ละโทเค็นยูทิลิตีคาดว่าจะเห็นจากบรรทัดคำสั่งในเครื่องหมายคำพูด

    & "c: \ path พร้อมช่องว่าง \ SomeCommand.exe" "/ parameter2" "/ parameter2" "ค่าพารามิเตอร์ของ parameter2" "Value2` "พร้อมเครื่องหมายคำพูด"

ลองสิ่งนี้:

zip filename.zip (Get-ChildItem somepath\*)

หรือแม้กระทั่ง:

zip filename.zip (Get-Content ListOfFiles.txt)

2

James Holwell ฉันชอบคำตอบของคุณ แต่ฉันขยายออกไปเล็กน้อย

# Example
#unzip "myZip.zip" "C:\Users\me\Desktop" "c:\mylocation"
function unzip($fileName, $sourcePath, $destinationPath)
{
    $shell = new-object -com shell.application
    if (!(Test-Path "$sourcePath\$fileName"))
    {
        throw "$sourcePath\$fileName does not exist" 
    }
    New-Item -ItemType Directory -Force -Path $destinationPath -WarningAction SilentlyContinue
    $shell.namespace($destinationPath).copyhere($shell.namespace("$sourcePath\$fileName").items()) 
}



0

ฉันได้สร้างโมดูลที่เข้ากันได้กับ PowerShell 2.0 ซึ่งใช้คำสั่งดั้งเดิมของระบบปฏิบัติการ Windows เพื่อ zip และคลายซิปไฟล์ในลักษณะซิงโครนัส สิ่งนี้ใช้ได้กับ OS ที่เก่ากว่าเช่น Windows XP และไม่จำเป็นต้องใช้. Net 4.5 หรือเครื่องมือภายนอกอื่น ๆ ฟังก์ชั่นนี้จะบล็อกการประมวลผลสคริปต์จนกว่าไฟล์ทั้งหมดจะได้รับการซิป / คลายซิป ท่านสามารถหาข้อมูลเพิ่มเติมและโมดูลในบล็อกของฉันที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.