SADECE Windows'un yerleşik yeteneklerini kullanarak komut dosyasını nasıl zipleyebilir veya açabilirsiniz?


294

Windows'ta bazı dosyaları

sağ tık → GönderSıkıştırılmış (sıkıştırılmış) klasör

Ve .zipdosyayı çift ​​tıklatarak açın ve dosyaları ayıklayın.

Bu yetenekleri herhangi bir üçüncü taraf yazılımı yüklemeye gerek kalmadan bir komut dosyasından (.bat dosyası) uygulamanın bir yolu var mı ?



16
Muhtemelen bir toplu iş dosyasından veya programdan çağırmak için. (İşte bu yüzden buradayım - zip dosyası olmasını gerektiren bir web sitesi için küçük bir ürün "oluşturmak" için hızlı bir .BAT dosyası oluşturmaya çalışıyorum.)
Jon Coombs

46
Bu sorunun kapatıldığına deli.
Sam Goldberg

1
Bu soruyu Süper Kullanıcıya taşımak mümkün mü?
Hanxue

21
2018'de hala çok yararlı ve ilgili.: P
Michael Fever

Yanıtlar:


82

2013 yılında bu mümkün değildi. Microsoft bunun için yürütülebilir dosya sağlamadı.

Bunu yapmanın bazı VBS yolu için bu bağlantıya bakın. /superuser/201371/create-zip-folder-from-the-command-line-windows

Windows 8'den itibaren, .NET Framework 4.5 varsayılan olarak System.IO.Compression.ZipArchive ve PowerShell kullanılabilir olarak yüklenir, bunu gerçekleştirmek için komut dosyaları yazılabilir, bkz. Https://stackoverflow.com/a/26843122/71312


1
PS'nin buna izin verdiği ve Windows'a önceden yüklendiği ve komut satırından ulaşılabildiği sürece bu doğru değildir.
Dan Atkinson

4
@DanAtkinson Güncellendi. 2013 yılında yanıtlandı, bağlantı bazı VBS yolu sağladı. PS yolu, Windows 8 veya sonraki bir sürümü gerektiren .Net 4.5'e ihtiyaç duyar.
Diryboy

Güncelleme için teşekkürler! Oyumu buna göre değiştirdim. :)
Dan Atkinson

6
@MichaelMrozek "Komut satırı" genel olarak CMD / COMMAND'a değil, herhangi bir komut satırına genel olarak atıfta bulunur ve PS * nix'de bash, sh, rsh gibi bir komut satırıdır. Ancak sadece bir tane daha ileri gitmek için, powershell'i komut satırından çalıştırabildiğiniz için, cmd / komutunun tek ve tek komut satırı olduğuna inanmak isteseniz bile soruyu cevaplar.
Robert McKee

1
O oldu (herhangi bir ekstra yazılım yüklemeden) 2013 yılında olası geri. Süper Kullanıcı sorusuna bakın . Windows XP'nin 2001'de piyasaya sürülmesinden bu yana mümkündür. Windows XP'deki yerleşik ZIP işlevselliği, bir COM arabirimi aracılığıyla açığa çıktığı için kullanılabilir .
Peter Mortensen

180

Steven Penny'nin PowerShell çözümünü genişletmek için, powershell.exe'yi aşağıdaki gibi çağırarak bir toplu iş dosyasına dahil edebilirsiniz:

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

Ivan Shilo'nun dediği gibi, bu PowerShell 2 ile çalışmaz, PowerShell 3 veya üstü ve .NET Framework 4 gerektirir.


1
Aslında, bu .NET 4.5'te kullanılabilir hale getirildi.
qJake

10
(Benim gibi) asıl dizine nasıl çıkarılacağını merak edenler için (yeni bir dizin oluşturmak yerine) sadece hedef parametresini ayarlayın '.', örneğin:powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.'); }"
Munchkin

Bu komutları sıkıştırmayı artırmak için kullanabilir miyiz? Dosya boyutunu azaltmak için Ultra sıkıştırma yapmak gibi mi?
Nigel Fds

1
Amaç nedir & {}? PS5 ile bu da işe yarıyor:powershell.exe -nologo -noprofile -command "Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.');"
Roi Danton

@RoiDanton src.zip ve dest.zip tanımlamak için stringformatter nasıl kullanılır?
PySaad

161

İtibariyle .NET 4.5 , PowerShell bunu yapabilirsiniz:

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

Son iki satır için barve foosahip klasörü istiyorum adıyla değiştirilebilir, ya da her ne ad önceden mevcut klasörün olduğunu. foo.zipher iki durumda da, olarak kaydetmek veya açmak için zip dosyası görevi görür.


17
Bu .NET 4.5 itibariyle.
qJake

Bu komutları sıkıştırmayı artırmak için kullanabilir miyiz? Dosya boyutunu azaltmak için Ultra sıkıştırma yapmak gibi mi?
Nigel Fds

Buradan yüklenen bir VM'de .NET v4.0.30319, v2.0.50727, v1.1.4322, v1.0.3705 yüklü: developer.microsoft.com/en-us/microsoft-edge/tools/vms ve bu işe yarıyor. .NET 4.5'e ihtiyacınız olmadığını tahmin ediyorum
alpha_989

Bu, modern sistemlerde en pratik çözümdür, 2GB üzerinde bir zip yazacak, standart Powershell "Sıkıştırma-Arşiv" başarısız olacaktır.
Shukri Adams

135

Java yüklüyse, şu jarkomutu kullanarak bir ZIP arşivine sıkıştırabilirsiniz :

jar -cMf targetArchive.zip sourceDirectory

c = Yeni bir arşiv dosyası oluşturur.

M = Manifest dosyasının arşive eklenmemesi gerektiğini belirtir.

f = Hedef dosya adını gösterir.


3
harika, teşekkürler, sadece ne aradığını ... FYI - Ben DOS eksi char kaldırmak zorunda kaldı ... örneğin kavanoz cMf target.zip sourceDir
mlo55 0

3
Fena değil, ama JDRE'nin yüklü olması gerekiyor, JRE'ye değil.
pdem

2
Güzel bir, muhtemelen bunun için platformdan en çok bağımsız çözüm;)
Adrian

YMMD. harika fikir. beni çok kurtardı.
gorefest

3
Bu, "... SADECE Windows'un yerleşik yeteneklerini kullanarak mı?" (Vurgu)
Peter Mortensen

84

PowerShell 5.0

Gönderen Microsoft.PowerShell.Archivekullanabilirsiniz:

Örneğin:

  • result.zipTüm Testklasörden oluştur :

    Compress-Archive -Path C:\Test -DestinationPath C:\result
    
  • result.zipBelirtilen Testklasördeki içeriğini ayıklayın :

    Expand-Archive -Path result.zip -DestinationPath C:\Test
    

13
Harika çalışıyor, teşekkürler. Burada biten herkes powershell Compress-Archive -Path C:\SomeFile.ext -DestinationPath C:\SomeFile.zipiçin, komut dosyası kullanmadan komut satırından kullanabilirsiniz (en azından Windows 7'ye geri dönebileceğiniz Powershell v5'in yüklü olduğu varsayılarak).
Beems

Harika çalışıyor, yeniden çalıştırmayı planlıyorsanız -Force seçeneği ekleyin.
Robin Salih

1
@Beems, Teşekkürler! Ama yolu / hedefi tam tersine mi delirdiğini sanıyorum?
Yiping

Bu çalışıyor, ancak arşiv farklı sıkıştırılmış sonra "Gönderilen -> sıkıştırılmış (sıkıştırılmış) klasör" Windows Gezgini'ni kullanırsanız ne olur
Powershell

Sıkıştır-Arşiv'in giriş dosyasında maksimum 2 GB dosya sınırı vardır
Sergei Rodionov

37

Tam olarak bir ZIP değil, ancak Windows araçlarını kullanarak bir dosyayı sıkıştırmanın tek yolu:

makecab <source> <dest>.cab

Sıkıştırmak için:

expand <source>.cab <dest>

Gelişmiş örnek (ss64.com'dan):

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"

Daha fazla bilgi: makecab , genişlet , makecab gelişmiş kullanımlar



34

7-Zip kullanma:

Zip : bir klasörünüz var foove onumyzip.zip

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

Sıkıştır : myzip.zipmevcut dizine ( ./) çıkartmak istiyorsunuz ( )

"C:\Program Files\7-Zip\7z.exe" x  myzip.zip  -o./ -y -r

31
Lütfen şu soruya dikkat edin:without the need to install any 3rd party
Roee Gavirel

16
@RoeeGavirel 7zip, herhangi bir Windows kurulumunda yüklediğiniz ilk şeylerden biri olmalıdır: P
developerbmw

3
@developerbmw - Neden? B. Üretimde ~ 100 makine var, üzerinde 7zip bulunmayan. Bunu kurmak için DevOps'u tüm bu makinelere ve kümelere eklenecek tüm yeni makinelere kurmam gerekiyordu. Bundan kaçınmayı tercih ederim.
Roee Gavirel

1
@Roland: lütfen spacific olabilir misiniz; nerede yanlış gidiyor? Bu her şeye yardımcı olacak.
Monir

1
@Roland: Yeni kontrol edildi, sözdizimi iyi çalışıyor. Muhtemelen, makinenizde olmayan "foo" klasörü ile deniyorsunuz. Sadece tahmin et.
Monir

9

Bu soruyu cevaplamaya çalışıyordum ve araştırmamdan DiryBoy'un yanıtı doğru görünüyor.

Compact.exe programının dosyaları sıkıştırdığını, ancak yüksek oranda sıkıştırılmış bir dosya (veya dosya kümesi) oluşturmayacağını buldum. Windows'ta bir sürücü harfini veya bölümünü sağ tıklattığınızda aldığınız seçeneğe benzer. Dosyaları temizleme (geçici dosyaları kaldırma, vb.) Ve dosyaları sıkıştırma seçeneği sunulur. Sıkıştırılmış dosyalara hala erişilebilir, ancak yalnızca az yer kaplayan bir sürücüde alan oluşturmak için sıkıştırılmıştır.

Ben de bilgisayarımda oldu kompres.exe bulundu. Çoğu Windows makinesinde yerel olarak bulunmaz ve 2003 kaynak kitinin bir parçasıdır. Sıkıştırılmış bir dosya türü yapar, ancak bir windows kurulum diskindeki dosyalara çok daha benzer (dosya uzantısının veya adının son karakteri olarak alt çizgiye sahiptir). Extract.exe komutu bu dosyaları ayıklar.

Bununla birlikte, mantra, eğer GUI aracılığıyla yerel olarak yapılabiliyorsa, bunu komut satırı içinde toplu iş, .vbs veya başka bir komut dosyası aracılığıyla yapmanın bir yolu vardır. Windows bir zip dosyası oluşturmak için 'gönder' seçeneğine sahip olduğundan, komut satırı yoluyla bunu yapmanın bir yolu olduğunu biliyordum ve bazı seçenekler buldum.

Windows yerel komutlarını kullanarak bir dosyanın nasıl sıkıştırılacağını gösteren harika bir bağlantı.

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

Birden çok iç içe dosya ve klasör içeren bir dizin ile test ettim ve mükemmel çalıştı. Sadece komut satırı biçimini takip edin.

Ayrıca dosyaları da bulduğum komut satırı üzerinden açmanın bir yolu var. Bir şekilde, sıkıştırılmış dosyanın içeriğinin ne olduğunu gösteren bir kaşif penceresi açar. Bunlardan bazıları, pencerelere özgü olmayan Java'yı da kullanıyor, ancak neredeyse öyle göründüğü kadar yaygın.

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

Komut satırını kullanarak dosya nasıl açılır?



8

Bir BAT dosyasına sarılmış bir VBScript betiği kullanabilirsiniz. Bu kod göreli bir PATH üzerinde çalışır.

Üçüncü taraf araçlara veya bağımlılıklara gerek yoktur. Sadece ayarlayın SOURCEDIRve OUTPUTZIP.

Dosyaadı: 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

Örnek kullanım

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

Alternatif olarak, bu dosyayı hat CScript _zipup.vbs %SOURCEDIR% %OUTPUTZIP%ile değiştirerek parametrelendirebilirsiniz CScript _zipup.vbs %1 %2, bu durumda sadece arayarak daha da kolay çağrılabilir CALL ZipUp C:\Source\Dir C:\Archive.zip.


İlk zip dosyasını oluşturan satırdan kaçınılmalıdır, aksi takdirde kodda son bulmaz.
kupa


Yanıt olarak düzgün bir şekilde kaçan bir sürüm ekledim.
fsteff

5

Tüm bu çözümlerle ilgili bir sorunum var.

Onlar konum tam olarak değil aynı ve hepsi hafif boyut farkı ile karşılaştırıldığında sahip dosyaları oluşturmak RMB --> send to --> compressed (zipped) folderaynı kaynak klasörden yaptığında. Ben sahip en yakın boyut farkı 300 KB fark (script> manual), ile yapılan:

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

( -CompressionLevel öğesine dikkat edin . Üç olası değer vardır : En Hızlı, Sıkıştırma ve En İyi, (Varsayılan: En İyi))

Üzerinde çalıştığım bir WordPress eklenti klasörünü otomatik olarak bir .zip arşivine sıkıştırması gereken bir .bat dosyası yapmak istedim, bu yüzden WordPress sitesine yükleyebilir ve eklentiyi test edebilirim.

Ancak bazı nedenlerden dolayı bu otomatik sıkıştırmaların hiçbiriyle çalışmaz , ancak manuel RMB sıkıştırma ile çalışır, cadı gerçekten garip buluyorum.

Betik tarafından oluşturulan .zip dosyaları aslında WordPress eklentilerini etkinleştirilemeyecekleri noktaya böler ve WordPress içinden de silinemezler. Sunucunun "arka tarafına" SSH ve elle yüklenen eklenti dosyalarını kendileri silmek zorunda. Manuel olarak RMB tarafından oluşturulan dosyalar normal çalışır.


Nedir "WBR" ve "RMB" ?
Peter Mortensen

RMB = Sağ Fare Düğmesi. <wbr> = tarayıcıya "Word BReak fırsatını" belirten bir HTML etiketi (çalışmadığı için kaldırıldı).
Sebastian Norr

4

Bunu bir komut dosyasının parçası olarak yapmanız gerekiyorsa, en iyi yol Java'yı kullanmaktır. Bin dizininin yolunuzda olduğunu varsayarsak (çoğu durumda) komut satırını kullanabilirsiniz:

jar xf test.zip

Java yolunuzda değilse doğrudan referans verin:

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

3

Açık kaynak arkadaşın :-)

İşte unzip : http://gnuwin32.sourceforge.net/packages/unzip.htm

Bir ZIP komutu da var: http://gnuwin32.sourceforge.net/packages/zip.htm

İkili indir yeterlidir.


Windows 8'de bir hata veriyor: bzip2.dll eksik.
Doug

1
@Ayak bzip2 sayfada bir gereksinim olduğunu ve indirmek için bir bağlantı olduğunu söylüyor
Sam

11
Orijinal soru, standart yerleşik Windows komutlarının nasıl kullanılacağıydı. Ayrıca, kendi aracınız veya çözümünüz artık bilgisayarlarında yönetici iznine sahip olan veya sistemlerinde giderek artan küçük bağımlılık koleksiyonunu umursamayan kullanıcılarla sınırlı olduğundan, kullanıcılarınızdan çeşitli üçüncü taraf çözümleri yüklemelerini istemek istenmeyen bir durumdur. . Açık kaynak arkadaşınız olabilir, ancak diğer açık kaynak paketlerini yüklemenizi gerektiren diğer açık kaynak paketlerini yüklemenizi gerektiren açık kaynak paketleri kesinlikle arkadaşınız değildir .
Steve Hollasch

SourceForge işimin güvenlik duvarı politikası tarafından engellendi :-(
SnookerC

1
Bu hala üçüncü taraf
yazılımlarını kullanmaktadır

3

Bu, @ PodTech.io tarafından verilen yanıtın güncellenmiş bir sürümüdür

Bu sürüm, toplu iş dosyasında doğru bir şekilde kaçan tüm vbs koduna sahiptir. Ayrıca, toplu komut dosyanızdaki herhangi bir yerden tek bir satırla çağrılabilen bir alt rutine de oluşturulur:

:: === 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

2

Bunu üçüncü taraf bir yazılım olmadan yapmaya çalıştığınızı söylüyorsunuz. .NET "üçüncü taraf" yazılımını düşünüp düşünmeyeceğinizden emin değilim.

Ancak, .NET'te kendi komut satırı yardımcı programınızı oluşturabilirsiniz. Birkaç satırdan fazla kod gerektirmemelidir.

ZipFile Sınıfı


0

@Jason Duffett'in yanıtı ve yorumlarına ek olarak, kullanıcıdan giriş ve çıkış (sırasıyla dosya adı ve dizin adı) alan bir komut dosyası :

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

Kullanımı:

unzip.bat path\to\file.zip path\to\output\directory

-4

Bir dosyayı sıkıştırmak için:

C:\> zip -9 -m -o file.dat.zip file.dat
  • -9 maksimum sıkıştırma
  • -m başarılı sıkıştırmadan sonra orijinal dosyayı sil
  • -o zip dosyasının değiştirilme tarihini orijinal dosyayla aynı olarak ayarlar
  • çok kötü biri yerine sıkıştırmak için dosya ot adına sadece .zip uzantısı ekleyerek yerine istenilen zip dosyasının adını vermek zorundadır

4
iki şey: (1) "zip" pencereleri ile sağlanmaz, bu yüzden muhtemelen bir 3. taraf var. ve sorumdan da bahsettiğim gibi, üçüncü tarafları kuramıyorum. (2) İstediğiniz adı sağlamanızın nedeni, dosya sıkıştırmanın dosya oluşturması ve arşivlenmesi (bir seanstaki klasör gibi) ve orada birden fazla dosyanızın olmasıdır.
Roee Gavirel

@RoeeGavirel Zip komut satırı yardımcı programını buldum sunucuda winzip GUI aracı yüklü değil, bu yüzden çıplak CLI aracının Windows ile birlikte geldiğini tahmin ettim. Öte yandan, sıkıştırılmış, bzip2 ve gzip gibi Unix / Linux sıkıştırma yardımcı programları, aynı adı taşıyan orijinal dosya artı uzantıya (.Z, .bz2 veya .gz) sahip sıkıştırılmış bir dosya oluşturur. sıkıştırılmış dosya.
Tulains Córdova

-4

Sıkıştırılmış veya yerel olarak sıkıştırılmış bir Windows dosyasını Genişlet komutunu kullanarak açabilirsiniz , örn.

expand MyFile.zip myFile

9
Bunu denedim, ancak MyFile.zip dosyasını myFile klasörüne kopyalar,
fhnaseer

Bu bana C: \> genişleme /?
snow6oy

11
Genişlet yalnızca .cab dosyasıyla çalışır ve zip dosyaları için uygun değildir.
рüффп

2
Buradaki diğer yorumları da. Expand file.zip filezip dosyasını uzantı olmadan başka bir dosyaya kopyalar. ZIP klasörünü bir klasöre açmaz.
Dave Marley
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.