Jak można skompresować lub rozpakować skrypt ze skryptu, korzystając TYLKO z wbudowanych funkcji systemu Windows?

294

W systemie Windows możesz skompresować niektóre pliki

kliknij prawym przyciskiem → Wyślij doSkompresowany (skompresowany) folder

I rozpakuj, klikając dwukrotnie .zipplik i rozpakuj pliki.

Czy istnieje sposób zastosowania tych umiejętności ze skryptu (pliku .bat) bez potrzeby instalowania oprogramowania innych firm ?

Roee Gavirel
źródło
16
Prawdopodobnie w celu wywołania go z pliku wsadowego lub programu. (Właśnie dlatego tu jestem - próbuję zrobić szybki plik .BAT, aby „zbudować” mały produkt dla strony internetowej, która wymaga, aby był to plik zip.)
Jon Coombs
46
Szalony, że to pytanie zostało zamknięte.
Sam Goldberg,
1
Czy można przenieść to pytanie do superużytkownika?
Hanxue
21
Nadal bardzo przydatny i odpowiedni w 2018 roku.: P
Michael Fever

Odpowiedzi:

82

W 2013 roku nie było to możliwe. Microsoft nie podał w tym celu żadnego pliku wykonywalnego.

Zobacz ten link, aby dowiedzieć się, jak to zrobić. /superuser/201371/create-zip-folder-from-the-command-line-windows

Od Windows 8, .NET Framework 4.5 jest instalowany domyślnie, z dostępnymi System.IO.Compression.ZipArchive i PowerShell, można napisać skrypty, aby to osiągnąć, patrz https://stackoverflow.com/a/26843122/71312

Diryboy
źródło
1
To nie jest poprawne, biorąc pod uwagę, że PS to umożliwia i jest wstępnie zainstalowany w systemie Windows i jest dostępny za pośrednictwem wiersza polecenia.
Dan Atkinson
4
@ DanAtkinson Zaktualizowano. Odpowiedzi udzielono w 2013 roku, link podał jakiś sposób VBS. PS wymaga wersji .Net 4.5, która wymaga systemu Windows 8 lub nowszego.
Diryboy
Dziękuję za aktualizację! Zmieniłem odpowiednio mój głos. :)
Dan Atkinson,
6
@MichaelMrozek Cóż, „linia poleceń” odnosi się ogólnie do dowolnej linii poleceń, a nie konkretnie do CMD / COMMAND, a PS zdecydowanie jest linią poleceń, podobnie jak bash, sh, rsh na * nix. Ale aby pójść o krok dalej, ponieważ możesz uruchomić PowerShell z wiersza poleceń, odpowiada on na pytanie, nawet jeśli chcesz wierzyć, że cmd / command to jedyna linia poleceń.
Robert McKee,
1
Było to możliwe w 2013 roku (bez instalowania dodatkowego oprogramowania). Zobacz pytanie superużytkownika . Jest to możliwe, odkąd system Windows XP pojawił się w 2001 roku. Wbudowana funkcja ZIP w systemie Windows XP może być wykorzystana, ponieważ jest widoczna przez interfejs COM .
Peter Mortensen,
180

Aby rozwinąć rozwiązanie PowerShell Stevena Penny'ego, możesz włączyć je do pliku wsadowego, wywołując powershell.exe w następujący sposób:

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

Jak powiedział Ivan Shilo, nie będzie to działać z PowerShell 2, wymaga PowerShell 3 lub nowszego i .NET Framework 4.

Jason Duffett
źródło
1
W rzeczywistości zostało to udostępnione w .NET 4.5.
qJake
10
Dla tych (takich jak ja), którzy zastanawiają się, jak wyodrębnić do rzeczywistego katalogu (zamiast tworzenia nowego katalogu), po prostu ustaw parametr docelowy na '.', np .:powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.'); }"
Munchkin
Czy możemy użyć tych poleceń, aby zwiększyć kompresję? Czy chcesz zrobić to Ultra kompresja, aby zmniejszyć rozmiar pliku?
Nigel Fds,
1
Jaki jest cel & {}? W przypadku PS5 to też działa:powershell.exe -nologo -noprofile -command "Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.');"
Roi Danton
@RoiDanton Jak korzystać z formatowania ciągów do definiowania src.zip i dest.zip?
PySaad
161

Począwszy od .NET 4.5 , PowerShell może to zrobić:

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

Przez ostatnie dwie linie, bara foomoże być zastąpione nazwą chcesz folder mieć, czy cokolwiek to nazwa folderu preegzystującym. foo.zipw obu przypadkach działa jako plik zip, aby zapisać jako lub rozpakować z.

Steven Penny
źródło
17
To jest od .NET 4.5.
qJake
Czy możemy użyć tych poleceń, aby zwiększyć kompresję? Czy chcesz zrobić to Ultra kompresja, aby zmniejszyć rozmiar pliku?
Nigel Fds,
Mam .NET v4.0.30319, v2.0.50727, v1.1.4322, v1.0.3705 zainstalowany na maszynie wirtualnej zainstalowanej tutaj: developer.microsoft.com/en-us/microsoft-edge/tools/vms , i to działa. , więc zgaduję, że nie potrzebujesz .NET 4.5
alpha_989
Jest to najbardziej praktyczne rozwiązanie w nowoczesnych systemach. Spowoduje to zapisanie pliku zip o rozmiarze ponad 2 GB, podczas gdy standardowe „Compress-Archive” Powershell zawiedzie.
Shukri Adams
135

Jeśli masz zainstalowaną Javę, możesz skompresować do archiwum ZIP za pomocą jarpolecenia:

jar -cMf targetArchive.zip sourceDirectory

c = Tworzy nowy plik archiwum.

M = Określa, że ​​plik manifestu nie powinien być dodawany do archiwum.

f = wskazuje nazwę pliku docelowego.

Noam Manos
źródło
3
super, dzięki, właśnie tego szukałem ... FYI - musiałem usunąć znak minus w DOS ... np. jar cMf target.zip sourceDir
mlo55
3
Nieźle, ale potrzebujesz zainstalowanego JDK, a nie JRE.
pdem
2
Fajne, prawdopodobnie najbardziej niezależne od platformy rozwiązanie tego problemu;)
Adrian
YMMD. świetny pomysł. zaoszczędził mi dużo czasu.
gorefest,
3
Czy to obejmuje „... używając TYLKO wbudowanych funkcji systemu Windows ?” (moje podkreślenie)
Peter Mortensen,
84

PowerShell 5.0

Od Microsoft.PowerShell.Archivemożesz użyć:

Na przykład:

  • Utwórz result.zipz całego Testfolderu:

    Compress-Archive -Path C:\Test -DestinationPath C:\result
    
  • Wyodrębnij zawartość z result.zipokreślonego Testfolderu:

    Expand-Archive -Path result.zip -DestinationPath C:\Test
    
ROMANIA_inżynier
źródło
13
Działa świetnie, dziękuję. Każdemu, kto znajdzie się na dole, możesz używać powershell Compress-Archive -Path C:\SomeFile.ext -DestinationPath C:\SomeFile.zipbezpośrednio z wiersza poleceń bez konieczności tworzenia skryptu (zakładając, że masz zainstalowany program Powershell v5, co możesz zrobić, wracając przynajmniej do Windows 7).
Beems
Działa świetnie, dodaj opcję -Force, jeśli planujesz ją ponownie uruchomić.
Robin Salih,
1
@ Beems, dziękuję! Ale myślę, że zwariowałeś na ścieżkę / cel na odwrót?
Yiping
Działa to, ale archiwum jest kompresowane inaczej niż w przypadku eksploratora Windows „Wysłane do -> skompresowany (skompresowany) folder” Wersja PowerShell jest większa i niektóre programy nie mogą rozpakować
Eric Labashosky
Compress-Archive ma maksymalny limit 2 GB na plik wejściowy
Siergiej Rodionow
37

Nie jest to dokładnie ZIP, ale jedynym sposobem kompresji pliku za pomocą narzędzi systemu Windows jest:

makecab <source> <dest>.cab

Aby zdekompresować:

expand <source>.cab <dest>

Zaawansowany przykład (z 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"

Więcej informacji: makecab , rozwiń , zaawansowane zastosowania makecab

Federico Santamorena
źródło
34

Korzystanie z 7-Zip:

Zip : masz folder fooi chcesz go skompresowaćmyzip.zip

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

Rozpakuj : chcesz rozpakować ( myzip.zip) do bieżącego katalogu ( ./)

"C:\Program Files\7-Zip\7z.exe" x  myzip.zip  -o./ -y -r
Monir
źródło
31
Proszę zwrócić uwagę na pytanie:without the need to install any 3rd party
Roee Gavirel
16
@RoeeGavirel 7zip powinien być jedną z pierwszych rzeczy, które instalujesz w dowolnej instalacji Windows: P
developerbmw
3
@developerbmw - A. dlaczego to jest? B. Obsługuję ~ 100 maszyn w produkcji, które nie mają na sobie 7zip. Aby zainstalować, musiałbym poprosić DevOps o zainstalowanie go na wszystkich tych komputerach i na wszystkich nowych komputerach, które zostaną dodane do klastrów. Wolałbym tego uniknąć.
Roee Gavirel
1
@Roland: czy możesz być kosmiczny; gdzie idzie źle? To pomoże wszystkim.
Monir
1
@Roland: Właśnie sprawdzone, składnia działa dobrze. Prawdopodobnie próbujesz z folderem „foo”, który nie jest obecny na twoim komputerze. Tylko zgadnij.
Monir
9

Chciałem odpowiedzieć na to dokładne pytanie i z moich badań wynika, że ​​odpowiedź DiryBoy wydaje się trafna.

Znalazłem program compact.exe kompresuje pliki, ale nie mogę utworzyć pliku o wysokim stopniu kompresji (lub zestawu plików). Jest podobny do opcji dostępnej po kliknięciu litery dysku lub partycji prawym przyciskiem myszy w systemie Windows. Otrzymasz opcję czyszczenia (usuwania plików tymczasowych itp.), A także kompresji plików. Skompresowane pliki są nadal dostępne, ale są po prostu skompresowane, aby utworzyć miejsce na dysku, który ma mało miejsca.

Znalazłem też plik compress.exe, który akurat miałem na swoim komputerze. Nie jest natywnie na większości komputerów z systemem Windows i jest częścią zestawu zasobów z 2003 roku. Tworzy spakowany plik, ale jest bardziej podobny do plików z dysku instalacyjnego systemu Windows (ma znak podkreślenia jako ostatni znak rozszerzenia lub nazwy pliku). A polecenie extract.exe wyodrębnia te pliki.

Jednak mantra jest taka, że ​​jeśli można to zrobić natywnie za pomocą GUI, prawdopodobnie istnieje sposób, aby to zrobić za pomocą partii, .vbs lub innego rodzaju skryptu w wierszu poleceń. Ponieważ system Windows ma opcję „wyślij do”, aby utworzyć plik zip, wiedziałem, że musi istnieć sposób, aby to zrobić za pomocą wiersza polecenia i znalazłem kilka opcji.

Oto świetny link, który pokazuje, jak skompresować plik za pomocą rodzimych poleceń systemu Windows.

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

Przetestowałem to z katalogiem zawierającym wiele zagnieżdżonych plików i folderów i działało idealnie. Wystarczy postępować zgodnie z formatem wiersza poleceń.

Istnieje również sposób na rozpakowanie plików za pomocą wiersza polecenia, który również znalazłem. Jednym ze sposobów jest otwarcie okna eksploratora pokazującego zawartość spakowanego pliku. Niektóre z nich używają również języka Java, który niekoniecznie jest natywny dla systemu Windows, ale jest tak powszechny, że prawie tak się wydaje.

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

Jak rozpakować plik za pomocą wiersza polecenia?

LostUser
źródło
8

Możesz użyć skryptu VBScript zawiniętego w plik BAT. Ten kod działa na względnej ścieżce.

Nie są potrzebne żadne narzędzia ani zależności innych firm. Po prostu ustaw SOURCEDIRiOUTPUTZIP .

Nazwa pliku: 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

Przykładowe użycie

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

Alternatywnie, można parametrize tego pliku zastępując linię CScript _zipup.vbs %SOURCEDIR% %OUTPUTZIP%ze CScript _zipup.vbs %1 %2w takim przypadku może to być nawet łatwiej wywoływana z po prostu dzwoni CALL ZipUp C:\Source\Dir C:\Archive.zip.

PodTech.io
źródło
Wiersz, który tworzy początkowy plik zip, musi być poprzedzony znakiem ucieczki, w przeciwnym razie nie znajdzie się w skrypcie.
puchar
Tak, to jest ta droga (jak w pytaniu Super User ).
Peter Mortensen,
Jako odpowiedź dodałem poprawną wersję.
fsteff
5

Mam problem ze wszystkimi tymi rozwiązaniami.

Nie są dokładnie takie same i wszystkie tworzą pliki, które mają niewielką różnicę wielkości w porównaniu do tego, RMB --> send to --> compressed (zipped) foldergdy są tworzone z tego samego folderu źródłowego. Najbliższa różnica wielkości, jaką miałem, to różnica 300 KB (skrypt> ręczny), wykonana za pomocą:

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

(Zwróć uwagę na -CompressionLevel . Istnieją trzy możliwe wartości : Najszybsza, Bez kompresji i Optymalna, (Domyślnie: Optymalna))

Chciałem utworzyć plik .bat, który powinien automatycznie kompresować folder wtyczki WordPress, nad którym pracuję, do archiwum .zip, dzięki czemu mogę przesłać go na stronę WordPress i przetestować wtyczkę.

Ale z jakiegoś powodu nie działa z żadną z tych automatycznych kompresji, ale działa z ręczną kompresją RMB, co wydaje mi się bardzo dziwne.

Generowane przez skrypt pliki .zip w rzeczywistości niszczą wtyczki WordPress do tego stopnia, że ​​nie można ich aktywować, a także nie można ich usunąć z wnętrza WordPress. Mam SSH na „tylnej stronie” serwera i ręcznie usuwam przesłane pliki wtyczek. Podczas gdy ręcznie generowane pliki RMB działają normalnie.

Sebastian Norr
źródło
Co to jest „wbr” i „RMB” ?
Peter Mortensen
RMB = prawy przycisk myszy. <wbr> = znacznik HTML wskazujący „możliwość Word Word” w przeglądarce (usunięty, ponieważ nie działał).
Sebastian Norr,
4

Jeśli musisz to zrobić jako część skryptu, najlepszym sposobem jest użycie Java. Zakładając, że katalog bin znajduje się na twojej ścieżce (w większości przypadków), możesz użyć wiersza poleceń:

jar xf test.zip

Jeśli Java nie znajduje się na Twojej ścieżce, odwołaj się bezpośrednio:

C:\Java\jdk1.6.0_03\bin>jar xf test.zip
eddyoc
źródło
3

Open source to twój przyjaciel :-)

Oto rozpakowanie : http://gnuwin32.sourceforge.net/packages/unzip.htm

Istnieje również polecenie ZIP: http://gnuwin32.sourceforge.net/packages/zip.htm

Wystarczy pobrać pliki binarne .

JanBorup
źródło
W systemie Windows 8 zgłasza błąd: brakuje pliku bzip2.dll.
Doug
1
@Doug mówi, że bzip2 jest wymagany na stronie i ma link do pobrania
Sam
11
Pierwotne pytanie brzmiało, jak korzystać ze standardowych wbudowanych poleceń systemu Windows. Ponadto wymaganie od użytkowników instalowania różnych rozwiązań innych firm jest niepożądane, ponieważ Twoje własne narzędzie lub rozwiązanie jest teraz ograniczone do użytkowników, którzy mają uprawnienia administracyjne na swoim komputerze lub nie dbają o rosnącą kolekcję niewielkich zależności w swoim systemie . Open source może być twoim przyjacielem, ale pakiety open source, które wymagają instalacji innych pakietów open source, które wymagają instalacji innych pakietów open source i tak dalej, zdecydowanie nie są twoim przyjacielem.
Steve Hollasch,
SourceForge jest zablokowany przez moją zaporę ogniową mojej pracy :-(
SnookerC
1
Nadal korzysta z oprogramowania firm trzecich
Деян Добромиров
3

To jest zaktualizowana wersja odpowiedzi udzielonej przez @ PodTech.io

W tej wersji cały kod VBS został poprawnie wstawiony do pliku wsadowego. Jest również utworzony w podprogramie, który można wywołać za pomocą pojedynczej linii z dowolnego miejsca w skrypcie wsadowym:

:: === 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
źródło
2

Mówisz, że próbujesz to zrobić bez oprogramowania innych firm. Nie jestem pewien, czy weźmiesz pod uwagę oprogramowanie .NET firmy zewnętrznej.

Ale możesz utworzyć własne narzędzie wiersza polecenia w .NET. Nie powinno to wymagać więcej niż kilku linii kodu.

ZipFile Class

NL3294
źródło
0

Dodając po @Jason Duffett za odpowiedź i uwagach, oto skrypt, który dostaje na wejściu i wyjściu (nazwa pliku i nazwę katalogu, odpowiednio) od użytkownika:

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

Stosowanie:

unzip.bat path\to\file.zip path\to\output\directory
Hej, Jude
źródło
-4

Aby skompresować plik:

C:\> zip -9 -m -o file.dat.zip file.dat
  • -9 maksymalna kompresja
  • -m usuń oryginalny plik po udanej kompresji
  • -o ustaw datę modyfikacji pliku zip tak samo jak oryginalny plik
  • szkoda, że ​​trzeba nadać mu nazwę żądanego pliku zip zamiast po prostu dodając rozszerzenie .zip do nazwy pliku do skompresowania
Tulains Córdova
źródło
4
dwie rzeczy: (1) „zip” nie jest dostarczany z oknami, więc prawdopodobnie jest to firma zewnętrzna. i jak wspomniałem w moim pytaniu, nie mogę zainstalować stron trzecich. (2) Powodem, dla którego musisz podać żądaną nazwę, jest to, że zipowanie tworzy i archiwizuje pliki (np. Folder w seansie) i możesz mieć tam więcej niż jeden plik.
Roee Gavirel
@RoeeGavirel Na serwerze znalazłem narzędzie wiersza polecenia zip, że nie ma zainstalowanego narzędzia GUI programu winzip, więc zgadłem, że gołe narzędzie CLI jest dostarczane z systemem Windows. Z drugiej strony narzędzia do kompresji Unix / Linux, takie jak kompresuj, bzip2 i gzip, tworzą skompresowany plik o tej samej nazwie i oryginalnym pliku z rozszerzeniem (.Z, .bz2 lub .gz), jeśli nie podasz żądanej nazwy skompresowany plik.
Tulains Córdova
-4

Możesz rozpakować skompresowany lub skompresowany plik systemu Windows za pomocą polecenia Rozwiń , np

expand MyFile.zip myFile
Lanca
źródło
9
Próbowałem tego, ale kopiuje MyFile.zip do folderu
myFile
Pomogło mi to C: \> rozwiń /?
snow6oy
11
Rozwiń działa tylko z plikiem .cab i nie jest odpowiedni dla plików zip.
рüффп
2
Podobnie jak pozostałe komentarze tutaj. Expand file.zip filepo prostu kopiuje zip do innego pliku bez rozszerzenia. Nie dekompresuje ZIP do folderu.
Dave Marley,