Bagaimana cara zip / unzip file di Powershell?

Jawaban:

21

DotNetZip akan memungkinkan Anda melakukan ini dari PowerShell. Ini bukan satu-liner, tetapi perpustakaan akan memungkinkan Anda untuk menulis skrip PowerShell yang Anda butuhkan.

Anda juga dapat menggunakan antarmuka COM, lihat Mengkompres File dengan Windows PowerShell kemudian mengemas Windows Vista Sidebar Gadget .

Googling "zip powershell" atau "unzip powershell" juga dapat menampilkan hasil yang bermanfaat.

Kevin Kuphal
sumber
+1 Artikel yang ditautkan memiliki Tugas yang berguna, tidak seperti jawaban yang paling banyak dipilih
Ruben Bartelink
5
-1 untuk menyarankan pencarian Google. Ini adalah hasil StackExchange teratas dalam pencarian Google untuk "unzip powershell"
mesin merindukan
154

Ini adalah bagaimana Anda dapat melakukannya sepenuhnya dari Powershell tanpa alat eksternal. Ini membuka ritsleting file bernama test.zip ke direktori kerja saat ini:

$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())
Ameer Deen
sumber
26
gunakan $ destination.Copyhere ($ zip_file.items (), 0x10) untuk menimpa file yang ada. 0x4 menyembunyikan kotak dialog, dan 0x14 menggabungkan ini dan menimpa dan menyembunyikan dialog.
Peter
3
Garis $destination.Copyhere($zip_file.items())melakukan unzip yang sebenarnya.
Jonathan Allen
2
Anda dapat membagi paket di atas menjadi sebuah fungsi, jika Anda menginginkan: 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()) }
James Holwell
6
Ini harus menjadi jawaban yang diterima.
tugberk
2
Ini gagal bagi saya ketika file zip hanya berisi folder (item kosong)
James Woolfenden
56

Sekarang di .NET Framework 4.5, ada kelas ZipFile yang bisa Anda gunakan seperti ini:

[System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
[System.IO.Compression.ZipFile]::ExtractToDirectory($sourceFile, $targetFolder)
mousio
sumber
1
Ini akan bagus jika ada metode sederhana untuk ExtractToDirectory dan opsi untuk menimpa semua file yang ada.
James Dunne
1
Ini bekerja dengan .NET 4.5. Namun Anda perlu Powershell V3 juga.
DalSoft
3
Muat unit dengan Add-Type, misalnya: Add-Type -AssemblyName System.IO.Compression.FileSystem
Mike
2
@JamesDunne - Jika Anda tidak memiliki file lain yang perlu Anda pertahankan, dapat menggunakan 'Remove-Item -Recurse $ TargetFolder'. Kalau tidak, apa yang Anda inginkan dapat dilakukan, tetapi itu tidak sepele. Anda harus membuka zip untuk dibaca, dan kemudian berjalan zip, menghapus objek target sebelumnya dan membongkar yang baru. Beruntung bagi saya, solusi mudahnya bekerja. ;)
Mike
3
Berhati-hatilah karena lokasi file relatif akan menggunakan direktori .NET saat ini, bukan direktori PowerShell. Lihat di sini . Mungkin lebih baik hanya dengan (Resolve-Path $someDir).Pathargumen.
jpmc26
18

Anda mungkin ingin memeriksa The PowerShell Community Extensions (PSCX) yang memiliki cmdlet khusus untuk ini.

Kevin Colby
sumber
1
+1 PSCX adalah seperangkat add-on cmdlet yang bagus - Saya hanya berharap saya bisa memilih yang mana yang saya inginkan dan yang tidak. Ini tampaknya akan berubah jauh dalam hal Powershell saya ....
marc_s
Saya sudah menemukan ini karena saya benar-benar ingin mengotomatisasi instalasi PSCX jika saya bisa untuk beberapa rekan kerja. Mencoba sekarang untuk melihat masalah apa yang saya
temui
16

Saya tahu ini adalah pertanyaan yang sangat lama, tetapi saya baru saja melihatnya tertaut di Twitter dengan alasan saya akan memposting jawaban saat ini.

PowerShell 5, saat ini tersedia di Windows 10 atau melalui Pratinjau Produksi Windows Management Framework 5 , dilengkapi dengan dua cmdlet bawaan untuk 'zipping' dan 'unzipping':

Windos
sumber
3
Merupakan hal yang baik untuk memberikan informasi baru ke pertanyaan lama. ;) +1
jpmc26
5

Saya menemukan solusi paling sederhana untuk hanya menggunakan binari infozip yang telah saya gunakan selama bertahun-tahun dan digunakan dalam lingkungan 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.

Akan sangat sulit untuk menempatkan pembungkus PowerShell di sekitar output teks tetapi dalam prakteknya saya tidak pernah membutuhkannya sehingga saya tidak merasa terganggu.

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

Brian Reiter
sumber
5

Saya juga suka Info-ZIP (mesin Zip yang ditemukan di sebagian besar utilitas Zip lainnya) dan 7-Zip , favorit lain yang memiliki kedua utilitas GUI dan baris perintah Zip. Intinya adalah, ada beberapa utilitas baris perintah yang baik yang akan bekerja untuk sebagian besar tugas PowerShell.

Ada beberapa trik untuk menjalankan utilitas baris perintah yang tidak dibangun dengan mempertimbangkan PowerShell:

  • Menjalankan executable yang dimulai dengan nomor dalam nama, kata pengantar dengan Ampersand (&).

    & 7zip.exe

  • Bungkus setiap token, utilitas mengharapkan untuk melihat dari baris perintah, dalam tanda kutip.

    & "c: \ path with space \ SomeCommand.exe" "/ parameter2" "/ parameter2" "Nilai parameter2" "Value2` "dengan penawaran"

Coba ini:

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

Atau bahkan:

zip filename.zip (Get-Content ListOfFiles.txt)
Nathan Hartley
sumber
2

James Holwell Saya suka jawaban Anda tetapi saya sedikit memperluasnya

# 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()) 
}
Nico
sumber
0

WinRAR dapat bekerja dalam mode CMD menerima argumen

adopilot
sumber
0

Saya telah membuat modul yang kompatibel dengan PowerShell 2.0 yang menggunakan perintah OS Windows asli untuk zip dan unzip file secara sinkron. Ini berfungsi pada OS lama, seperti Windows XP, dan tidak memerlukan. Net 4.5 atau alat eksternal lainnya. Fungsi-fungsi ini juga akan memblokir eksekusi skrip sampai semua file di-zip / di-zip. Anda dapat menemukan informasi lebih lanjut dan modul di blog saya di sini .

deadlydog
sumber