Bagaimana Anda bisa zip atau unzip dari skrip menggunakan HANYA kemampuan bawaan Windows?

294

Di Windows Anda dapat zip beberapa file dengan

klik kanan → Kirim kefolder Terkompresi (zip)

Dan unzip dengan mengklik dua kali pada .zipfile dan mengekstrak file.

Apakah ada cara untuk menerapkan kemampuan itu dari skrip (file .bat) tanpa perlu menginstal perangkat lunak pihak ketiga ?

Roee Gavirel
sumber
16
Yah, itu mungkin untuk menyebutnya dari file batch atau program. (Itulah sebabnya saya di sini - mencoba membuat file .BAT cepat untuk "membuat" sedikit produk untuk situs web yang mengharuskannya menjadi file zip.)
Jon Coombs
46
Gila pertanyaan ini sudah ditutup.
Sam Goldberg
1
Apakah mungkin untuk memindahkan pertanyaan ini ke Pengguna Super?
Hanxue
21
Masih sangat berguna dan relevan pada tahun 2018.: P
Michael Fever

Jawaban:

82

Kembali pada tahun 2013, itu tidak mungkin. Microsoft tidak menyediakan executable untuk ini.

Lihat tautan ini untuk beberapa cara VBS untuk melakukan ini. /superuser/201371/create-zip-folder-from-the-command-line-windows

Dari Windows 8 pada, .NET Framework 4.5 diinstal secara default, dengan System.IO.Compression.ZipArchive dan PowerShell tersedia, orang dapat menulis skrip untuk mencapai ini, lihat https://stackoverflow.com/a/26843122/71312

Diryboy
sumber
1
Ini tidak benar mengingat PS memperbolehkan ini dan sudah diinstal sebelumnya pada Windows dan tersedia melalui baris perintah.
Dan Atkinson
4
@DanAtkinson Diperbarui. Itu dijawab kembali pada tahun 2013, tautan menyediakan beberapa cara VBS. Cara PS membutuhkan .Net 4.5, yang membutuhkan Windows 8 atau lebih tinggi.
Diryboy
Terima kasih atas pembaruannya! Telah mengubah suara saya sesuai. :)
Dan Atkinson
6
@MichaelMrozek "Baris perintah" merujuk secara umum ke setiap baris perintah, tidak secara khusus CMD / PERINTAH, dan PS jelas merupakan baris perintah, seperti halnya bash, sh, rsh pada * nix. Tetapi hanya untuk melangkah lebih jauh, karena Anda dapat menjalankan PowerShell dari baris perintah, itu memang menjawab pertanyaan bahkan jika Anda ingin percaya bahwa cmd / perintah adalah satu-satunya baris perintah.
Robert McKee
1
Ini adalah kemungkinan kembali pada tahun 2013 (tanpa menginstal perangkat lunak tambahan). Lihat pertanyaan Pengguna Super . Itu telah dimungkinkan sejak Windows XP keluar pada tahun 2001. Fungsionalitas ZIP bawaan pada Windows XP dapat ditingkatkan karena diekspos melalui antarmuka COM .
Peter Mortensen
180

Untuk memperluas pada solusi PowerShell Steven Penny, Anda dapat memasukkannya ke dalam file batch dengan memanggil powershell.exe seperti ini:

powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', 'bar'); }"

Seperti yang dikatakan Ivan Shilo, ini tidak akan berfungsi dengan PowerShell 2, membutuhkan PowerShell 3 atau lebih tinggi dan .NET Framework 4.

Jason Duffett
sumber
1
Sebenarnya, ini tersedia di .NET 4.5.
qJake
10
Bagi mereka (seperti saya) yang bertanya-tanya bagaimana cara mengekstrak ke direktori aktual (alih-alih membuat direktori baru) cukup atur parameter target '.', misalnya:powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.'); }"
Munchkin
Bisakah kita menggunakan perintah ini untuk meningkatkan kompresi? Suka membuatnya kompresi Ultra untuk mengurangi ukuran file?
Nigel Fds
1
Apa tujuannya & {}? Dengan PS5 ini bekerja juga:powershell.exe -nologo -noprofile -command "Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.');"
Roi Danton
@RoiDanton Bagaimana cara menggunakan stringformatter untuk mendefinisikan src.zip dan dest.zip?
PySaad
161

Pada .NET 4.5 , PowerShell dapat melakukan ini:

Add-Type -A System.IO.Compression.FileSystem
[IO.Compression.ZipFile]::CreateFromDirectory('foo', 'foo.zip')
[IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', 'bar')

Untuk dua baris terakhir, bardan foodapat diganti dengan nama yang Anda inginkan foldernya, atau apa pun namanya dari folder yang sudah ada sebelumnya. foo.zipdalam kedua kasus bertindak sebagai file zip untuk menyimpan sebagai atau untuk unzip.

Steven Penny
sumber
17
Ini pada .NET 4.5.
qJake
Bisakah kita menggunakan perintah ini untuk meningkatkan kompresi? Suka membuatnya kompresi Ultra untuk mengurangi ukuran file?
Nigel Fds
Saya memiliki .NET v4.0.30319, v2.0.50727, v1.1.4322, v1.0.3705 diinstal melalui pada VM yang diinstal dari sini: developer.microsoft.com/en-us/microsoft-edge/tools/vms , dan ini berfungsi. jadi saya
kira
Ini adalah solusi paling praktis pada sistem modern, ini akan menulis zip lebih dari 2GB, sedangkan Powershell standar "Compress-Archive" akan gagal.
Shukri Adams
135

Jika Anda telah menginstal Java, Anda dapat mengompres ke arsip ZIP menggunakan jarperintah:

jar -cMf targetArchive.zip sourceDirectory

c = Membuat file arsip baru.

M = Menentukan bahwa file manifes tidak boleh ditambahkan ke arsip.

f = Menunjukkan nama file target.

Noam Manos
sumber
3
luar biasa, terima kasih, hanya apa yang saya cari ... FYI - Saya harus menghapus minus char di DOS ... mis. jar cMf target.zip sourceDir
mlo55
3
Tidak buruk, tetapi Anda perlu menginstal JDK, bukan JRE.
pdem
2
Bagus, mungkin solusi platform paling independen untuk ini;)
Adrian
YMMD. ide yang luar biasa. menyelamatkan saya banyak waktu.
gorefest
3
Apakah ini ditutupi oleh "... menggunakan HANYA Windows built-in kemampuan?" (Penekanan saya)
Peter Mortensen
84

PowerShell 5.0

Dari Microsoft.PowerShell.ArchiveAnda dapat menggunakan:

Misalnya:

  • Buat result.zipdari seluruh Testfolder:

    Compress-Archive -Path C:\Test -DestinationPath C:\result
    
  • Ekstrak konten result.zipdalam Testfolder yang ditentukan :

    Expand-Archive -Path result.zip -DestinationPath C:\Test
    
ROMANIA_engineer
sumber
13
Ini bekerja dengan baik, terima kasih. Untuk siapa pun yang berakhir di sini, Anda dapat menggunakan powershell Compress-Archive -Path C:\SomeFile.ext -DestinationPath C:\SomeFile.ziplangsung dari baris perintah tanpa perlu membuat skrip (dengan asumsi Anda telah menginstal Powershell v5, yang dapat Anda lakukan setidaknya kembali ke Windows 7).
Beems
Bekerja dengan baik, tambahkan opsi-Force jika Anda berencana menjalankannya kembali.
Robin Salih
1
@Beems, Terima kasih! Tapi saya pikir Anda gila jalan / tujuan sebaliknya?
Yiping
Ini berfungsi, tetapi arsip dikompresi secara berbeda dari apa yang terjadi jika Anda menggunakan windows explorer "Terkirim ke -> folder terkompresi (zip)" Versi PowerShell lebih besar dan beberapa program tidak dapat mengekstraksi
Eric Labashosky
Compress-Archive memiliki batas file maksimum 2GB pada file input
Sergei Rodionov
37

Ini bukan ZIP, tetapi satu-satunya cara untuk kompres file menggunakan alat Windows adalah:

makecab <source> <dest>.cab

Untuk mendekompres:

expand <source>.cab <dest>

Contoh lanjutan (dari ss64.com):

Create a self extracting archive containing movie.mov:
C:\> makecab movie.mov "temp.cab"
C:\> copy /b "%windir%\system32\extrac32.exe"+"temp.cab" "movie.exe"
C:\> del /q /f "temp.cab"

Informasi lebih lanjut: makecab , perluas , makecab menggunakan lanjutan

Federico Santamorena
sumber
34

Menggunakan 7-Zip:

Zip : Anda memiliki folder foo, dan ingin meng-zipnyamyzip.zip

"C:\Program Files\7-Zip\7z.exe" a  -r myzip.zip -w foo -mem=AES256

Unzip : Anda ingin unzip ( myzip.zip) ke direktori saat ini ( ./)

"C:\Program Files\7-Zip\7z.exe" x  myzip.zip  -o./ -y -r
Monir
sumber
31
Harap perhatikan pertanyaan:without the need to install any 3rd party
Roee Gavirel
16
@RoeeGavirel 7zip harus menjadi salah satu hal pertama yang Anda instal pada setiap instalasi Windows: P
developerbmw
3
@developerbmw - A.mengapa itu? B. Saya menangani ~ 100 mesin dalam produksi yang tidak memiliki 7 zip pada mereka. Untuk menginstal itu saya harus mendapatkan DevOps menginstalnya di semua mesin itu dan pada semua mesin baru yang akan ditambahkan ke cluster. Saya lebih suka menghindarinya.
Roee Gavirel
1
@Roland: bisakah Anda bersikap spacific; mana yang salah? Itu akan membantu semua.
Monir
1
@Roland: Baru diperiksa, sintaksnya bekerja dengan baik. Mungkin, Anda mencoba dengan folder "foo" yang tidak ada di mesin Anda. Tapi tebak saja.
Monir
9

Saya sudah mencari untuk menjawab pertanyaan yang tepat ini dan dari penelitian saya, tanggapan DiryBoy tampaknya akurat.

Saya menemukan program compact.exe kompres file tetapi tidak untuk membuat file yang sangat terkompresi (atau kumpulan file). Ini mirip dengan opsi yang Anda dapatkan saat mengklik kanan huruf drive atau partisi di Windows. Anda mendapatkan opsi untuk melakukan pembersihan (menghapus file temp, dll) serta mengkompres file. File yang dikompresi masih dapat diakses tetapi hanya dikompres untuk membuat ruang pada drive yang ruangnya rendah.

Saya juga menemukan compress.exe yang kebetulan saya miliki di komputer saya. Ini tidak asli pada kebanyakan mesin windows dan merupakan bagian dari kit sumber daya 2003. Itu memang membuat file zip semacam tetapi benar-benar lebih mirip dengan file dari disk setup windows (memiliki garis bawah sebagai karakter terakhir dari ekstensi file atau nama). Dan perintah extract.exe mengekstrak file-file itu.

Namun, mantra adalah, jika itu dapat dilakukan secara native melalui GUI maka ada kemungkinan cara untuk melakukannya melalui batch, .vbs, atau beberapa jenis skrip lain dalam baris perintah. Karena windows memiliki opsi 'kirim ke' untuk membuat file zip, saya tahu harus ada cara untuk melakukannya melalui baris perintah dan saya menemukan beberapa opsi.

Berikut ini adalah tautan bagus yang menunjukkan bagaimana cara zip file menggunakan perintah windows asli.

/superuser/110991/can-you-zip-a-file-from-the-command-prompt-using-only-windows-built-in-capabili

Saya mengujinya dengan direktori yang berisi beberapa file dan folder bersarang dan itu berfungsi dengan baik. Cukup ikuti format baris perintah.

Ada juga cara untuk membuka zip file melalui command line yang saya temukan juga. Salah satu caranya, cukup buka jendela explorer yang menunjukkan konten file yang di-zip. Beberapa dari ini juga menggunakan Java yang tidak selalu asli ke windows tetapi sangat umum sehingga hampir tampak begitu.

/superuser/149489/does-windows-7-have-unzip-at-the-command-line-installed-by-default

Bagaimana cara unzip file menggunakan baris perintah?

LostUser
sumber
Tidak, tanggapan DiryBoy tidak akurat
Peter Mortensen
8

Anda dapat menggunakan skrip VBScript yang dibungkus dengan file BAT. Kode ini berfungsi pada PATH relatif.

Tidak ada kebutuhan untuk alat pihak ketiga atau dependensi. Cukup atur SOURCEDIRdan OUTPUTZIP.

Nama file: ZipUp.bat

echo Set fso = CreateObject("Scripting.FileSystemObject") > _zipup.vbs
echo InputFolder = fso.GetAbsolutePathName(WScript.Arguments.Item(0)) >> _zipup.vbs
echo ZipFile = fso.GetAbsolutePathName(WScript.Arguments.Item(1)) >> _zipup.vbs

' Create empty ZIP file.
echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipup.vbs

echo Set objShell = CreateObject("Shell.Application") >> _zipup.vbs
echo Set source = objShell.NameSpace(InputFolder).Items >> _zipup.vbs
echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipup.vbs

echo ' Keep script waiting until compression is done
echo Do Until objShell.NameSpace( ZipFile ).Items.Count = objShell.NameSpace( InputFolder ).Items.Count >> _zipup.vbs
echo     WScript.Sleep 200 >> _zipup.vbs
echo Loop >> _zipup.vbs

CScript  _zipup.vbs  %SOURCEDIR%  %OUTPUTZIP%

del _zipup.vbs

Contoh penggunaan

SET SOURCEDIR=C:\Some\Path
SET OUTPUTZIP=C:\Archive.zip
CALL ZipUp

Atau, Anda dapat menentukan parameter file ini dengan mengganti baris CScript _zipup.vbs %SOURCEDIR% %OUTPUTZIP%dengan CScript _zipup.vbs %1 %2, dalam hal ini bahkan dapat lebih mudah dipanggil hanya dengan menelepon CALL ZipUp C:\Source\Dir C:\Archive.zip.

PodTech.io
sumber
Baris yang membuat file zip awal harus diloloskan jika tidak maka tidak akan berakhir di skrip.
piala
Ya, ini adalah jalan yang harus ditempuh (seperti dalam pertanyaan Pengguna Super ).
Peter Mortensen
Saya menambahkan versi yang lolos dengan benar sebagai jawaban.
fsteff
5

Saya punya masalah dengan semua solusi ini.

Mereka tidak persis sama, dan mereka semua membuat file yang memiliki sedikit perbedaan ukuran dibandingkan dengan RMB --> send to --> compressed (zipped) folderketika dibuat dari folder sumber yang sama. Perbedaan ukuran terdekat yang saya miliki adalah perbedaan 300 KB (skrip> manual), dibuat dengan:

powershell Compress-Archive -Path C:\sourceFolder -CompressionLevel Fastest -DestinationPath C:\destinationArchive.zip

(Perhatikan -CompressionLevel . Ada tiga kemungkinan nilai : Tercepat, NoCompression & Optimal, (Default: Optimal))

Saya ingin membuat file .bat yang secara otomatis akan mengompres folder plugin WordPress yang saya kerjakan, menjadi arsip .zip, sehingga saya dapat mengunggahnya ke situs WordPress dan menguji plugin tersebut.

Tetapi untuk beberapa alasan itu tidak bekerja dengan kompresi otomatis ini, tetapi tidak bekerja dengan kompresi RMB manual, penyihir yang saya temukan benar-benar aneh.

Dan file .zip yang dihasilkan skrip benar-benar memecah plugin WordPress ke titik di mana mereka tidak dapat diaktifkan, dan mereka juga tidak dapat dihapus dari dalam WordPress. Saya harus SSH ke "sisi belakang" server dan menghapus file plugin yang diunggah secara manual. Sementara file yang dihasilkan secara manual RMB bekerja secara normal.

Sebastian Norr
sumber
Apa itu "wbr" dan "RMB" ?
Peter Mortensen
RMB = Tombol Mouse Kanan. <wbr> = tag HTML yang menunjukkan "peluang Word BReak" ke browser (dihapus, karena tidak berfungsi).
Sebastian Norr
4

Jika Anda perlu melakukan ini sebagai bagian dari skrip maka cara terbaik adalah menggunakan Java. Dengan asumsi direktori bin berada di jalur Anda (dalam kebanyakan kasus), Anda dapat menggunakan baris perintah:

jar xf test.zip

Jika Java tidak ada di jalur Anda, rujuk langsung:

C:\Java\jdk1.6.0_03\bin>jar xf test.zip
eddyoc
sumber
3

Sumber terbuka adalah teman Anda :-)

Inilah unzip : http://gnuwin32.sourceforge.net/packages/unzip.htm

Ada perintah ZIP juga: http://gnuwin32.sourceforge.net/packages/zip.htm

The binari download cukup.

JanBorup
sumber
Pada Windows 8, ada kesalahan: bzip2.dll tidak ada.
Doug
1
@Apakah ia mengatakan bahwa bzip2 adalah persyaratan pada halaman tersebut dan memiliki tautan untuk mengunduh
Sam
11
Pertanyaan aslinya adalah bagaimana cara menggunakan perintah Windows bawaan bawaan. Selain itu, mewajibkan pengguna Anda untuk menginstal berbagai solusi pihak ketiga tidak diinginkan karena alat atau solusi Anda sendiri sekarang terbatas pada pengguna yang memiliki izin administratif di komputer mereka, atau yang tidak peduli dengan semakin banyaknya koleksi ketergantungan kecil pada sistem mereka. . Sumber terbuka mungkin adalah teman Anda, tetapi paket sumber terbuka yang mengharuskan Anda menginstal paket sumber terbuka lain yang mengharuskan Anda untuk menginstal paket sumber terbuka lainnya dan seterusnya jelas bukan teman Anda.
Steve Hollasch
SourceForge diblokir oleh kebijakan firewall pekerjaan saya :-(
SnookerC
1
Ini masih menggunakan sotware pihak ketiga
Деян Добромиров
3

Ini adalah versi terbaru untuk jawaban yang diberikan oleh @ PodTech.io

Versi ini memiliki semua kode vbs dengan benar lolos dalam file batch. Ini juga dibuat menjadi sub-rutin, yang dapat dipanggil dengan satu baris dari mana saja dalam skrip batch Anda:

:: === Main code:

call :ZipUp "C:\Some\Path" "C:\Archive.zip"


:: === SubRoutines:

:ZipUp
::Arguments: Source_folder, destination_zip
(
    echo:Set fso = CreateObject^("Scripting.FileSystemObject"^)
    echo:InputFolder = fso.GetAbsolutePathName^(WScript.Arguments.Item^(0^)^)
    echo:ZipFile = fso.GetAbsolutePathName^(WScript.Arguments.Item^(1^)^)
    echo:
    echo:' Create empty ZIP file.
    echo:CreateObject^("Scripting.FileSystemObject"^).CreateTextFile^(ZipFile, True^).Write "PK" ^& Chr^(5^) ^& Chr^(6^) ^& String^(18, vbNullChar^)
    echo:
    echo:Set objShell = CreateObject^("Shell.Application"^)
    echo:Set source = objShell.NameSpace^(InputFolder^).Items
    echo:objShell.NameSpace^(ZipFile^).CopyHere^(source^)
    echo:
    echo:' Keep script waiting until compression is done
    echo:Do Until objShell.NameSpace^( ZipFile ^).Items.Count = objShell.NameSpace^( InputFolder ^).Items.Count
    echo:    WScript.Sleep 200
    echo:Loop
)>_zipup.vbs
CScript //Nologo _zipup.vbs "%~1" "%~2"
del _zipup.vbs
goto :eof
fsteff
sumber
2

Anda mengatakan Anda mencoba melakukan ini tanpa perangkat lunak pihak ketiga. Saya tidak yakin apakah Anda akan mempertimbangkan perangkat lunak .NET "pihak ketiga".

Tetapi Anda dapat membuat utilitas baris perintah Anda sendiri di .NET. Seharusnya tidak memerlukan lebih dari beberapa baris kode.

Kelas ZipFile

NL3294
sumber
0

Menambahkan jawaban @Jason Duffett dan komentarnya, inilah skrip yang mendapat input dan output (nama file dan nama direktori, masing-masing) dari pengguna:

@echo off
set input=%1
set output=%2
powershell.exe "Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('%input%', '%output%');"

Pemakaian:

unzip.bat path\to\file.zip path\to\output\directory
Hei jude
sumber
-4

Untuk menyalin file:

C:\> zip -9 -m -o file.dat.zip file.dat
  • -9 kompresi maksimum
  • -m hapus file asli setelah kompresi berhasil
  • -untuk mengatur tanggal modifikasi file zip sama dengan file asli
  • terlalu buruk seseorang harus memberikannya nama file zip yang diinginkan alih-alih itu hanya menambahkan ekstensi .zip ke nama atau file untuk kompres
Tulains Córdova
sumber
4
dua hal: (1) "zip" tidak disediakan dengan windows, jadi mungkin pihak ke-3 yang Anda miliki. dan seperti pertanyaan saya sebutkan, saya tidak bisa menginstal pihak ke-3. (2) Alasan Anda perlu memberikan nama yang diinginkan adalah karena membuat zip membuat dan mengarsipkan file (seperti folder dalam pemanggilan arwah) dan Anda mungkin memiliki lebih dari satu file di sana.
Roee Gavirel
@RoeeGavirel Di server saya menemukan utilitas baris perintah zip tidak ada alat GUI winzip diinstal jadi saya kira alat CLI telanjang datang dengan Windows. Di sisi lain Utilitas kompres Unix / Linux seperti kompres, bzip2 dan gzip membuat file terkompresi dengan nama file asli yang sama ditambah ekstensi (.Z, .bz2 atau .gz), jika Anda tidak memberikan nama yang diinginkan file terkompresi.
Tulains Córdova
-4

Anda dapat mengompres file Windows terkompresi atau zip asli dengan menggunakan perintah Expand , misalnya

expand MyFile.zip myFile
Tombak
sumber
9
Saya mencobanya, tetapi menyalin MyFile.zip ke folder myFile,
fhnaseer
Ini membantu saya C: \> expand /?
snow6oy
11
Perluas hanya berfungsi dengan file .cab dan tidak sesuai untuk file zip.
рüффп
2
Demikian komentar lainnya di sini. Expand file.zip filecukup salin zip ke file lain tanpa ekstensi. Itu tidak membuka kompresi ZIP ke folder.
Dave Marley