Saya punya .zip
file dan perlu membongkar seluruh kontennya menggunakan Powershell. Saya melakukan ini tetapi sepertinya tidak berhasil:
$shell = New-Object -ComObject shell.application
$zip = $shell.NameSpace("C:\a.zip")
MkDir("C:\a")
foreach ($item in $zip.items()) {
$shell.Namespace("C:\a").CopyHere($item)
}
Apa yang salah? Direktori C:\a
masih kosong.
powershell
Uli Kunkel
sumber
sumber
Jawaban:
Berikut adalah cara sederhana menggunakan ExtractToDirectory dari System.IO.Compression.ZipFile :
Perhatikan bahwa jika folder target tidak ada, ExtractToDirectory akan membuatnya. Peringatan lainnya:
Lihat juga:
sumber
Exception calling "ExtractToDirectory" with "2" argument(s): "End of Central Directory record could not be found." At line:5 char:5 + [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $ou ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : InvalidDataException
Add-Type : Cannot add type. The assembly 'System.IO.Compression.FileSystem' could not be found.
. Saya telah menginstal .NET 4.6.2, dan saya telah memverifikasi bahwa perakitan di GAC, tapi saya tidak tahu mengapa saya mendapatkan kesalahan ini.Di PowerShell v5 +, ada perintah Expand-Archive (dan juga Compress-Archive) bawaan:
sumber
$PSVersionTable.PSVersion
untuk menentukan versi PowerShell apa yang Anda jalankan.OutputPath
telah diubah menjadiDestinationPath
(referensi msdn.microsoft.com/powershell/reference/5.1/… )Expand-Archive -Path .\a.zip -DestinationPath .
Di PowerShell v5.1 ini sedikit berbeda dibandingkan dengan v5. Menurut dokumentasi MS, itu harus memiliki
-Path
parameter untuk menentukan path file arsip.Atau yang lain, ini bisa menjadi jalan yang sebenarnya:
Expand-Archive Doc
sumber
Expand-Archive Draft.Zip -DestinationPath C:\Reference
bekerja tanpa masalah. Selain itu, ini bukan jalur yang sebenarnya , tetapi jalur absolut .Gunakan
Expand-Archive
cmdlet dengan salah satu dari set parameter:sumber
Hai ini bekerja untuk saya ..
sumber
CopyHere
metode ini. Saya kira @OlegKazakov sudah menyelesaikan masalahnya. Namun demikian saya meletakkan tautan ini di sini untuk peselancar lain yang dapat menemukan topik ini: docs.microsoft.com/en-us/previous-versions/windows/desktop/…Bagi mereka yang ingin menggunakan Shell.Application.Namespace.Folder.CopyHere () dan ingin menyembunyikan progress bar saat menyalin, atau menggunakan lebih banyak opsi, dokumentasi ada di sini:
https://docs.microsoft.com/en-us / windows / desktop / shell / folder-copyhere
Untuk menggunakan PowerShell dan menyembunyikan progress bar dan menonaktifkan konfirmasi, Anda dapat menggunakan kode seperti ini:
Keterbatasan penggunaan Shell.Application pada versi inti windows:
https://docs.microsoft.com/en-us/windows-server/administration/server-core/what-is-server-core
Pada versi windows core , secara default Microsoft-Windows-Server-Shell-Package tidak diinstal, jadi shell.applicaton tidak akan berfungsi.
Catatan : Mengekstrak arsip dengan cara ini akan memakan waktu lama dan dapat memperlambat windows gui
sumber
Menggunakan
expand-archive
tetapi menciptakan direktori secara otomatis dinamai arsip:sumber
outputPath
seperti pada jawaban yang diterima. Dalam solusi ini (seperti yang dikatakan jpmc26), Anda akan selalu membuat direktori baru di direktori saat ini sehingga mungkin Anda perlu mengatur direktori saat ini sebelum meneleponunzip
Menggunakan:
sumber
$archive
dan$archiveFile
pada akhirnyaForEach
Loop memproses setiap file ZIP yang terletak di dalam$filepath
variabelsumber