Jak utworzyć archiwum ZIP za pomocą PowerShell

PowerShell 5.0 (dołączony do Windows Management Framework 5.0, który jest domyślnie dołączony do Windows 10) ma osobny moduł Microsoft.PowerShell.Archive, który pozwala tworzyć i rozpakowywać archiwa ZIP z wiersza poleceń lub ze skryptów PowerShell. Listę dostępnych poleceń cmdlet w module Microsoft.PowerShell.Archive (C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ Modules \ Microsoft.PowerShell.Archive) można uzyskać za pomocą Get-Command.

Get-Command-Moduł Microsoft.PowerShell.Archive | Format-Table -AutoSize;

CommandType Nazwa Wersja Źródło
- --             -- -
Funkcja Compress-Archive 1.0.0.0 Microsoft.PowerShell.Archive
Funkcja Expand-Archive 1.0.0.0 Microsoft.PowerShell.Archive

Jak widzimy, dostępne są dwa polecenia cmdlet, których nazwy mówią same za siebie:

  • Kompresuj Archiwum
  • Rozwiń Archiwum

Spójrzmy na przykłady użycia tych poleceń cmdlet do tworzenia / rozpakowywania archiwów ZIP z określonych plików lub katalogów.

Format polecenia Kompresuj Archiwum następujące:

Compress-Archive [-Path] String [] [-DestinationPath] String [-CompressionLevel String] [-Update]

W parametrze Ścieżka pliki źródłowe do spakowania są określone, -DestinationPath -lokalizacja utworzonego pliku archiwum, CompressionLevel - poziom kompresji (bez kompresji, optymalny lub najszybszy). Parametr -Aktualizacja pozwala dodawać / aktualizować pliki w istniejącym archiwum ZIP. Z kluczem -Siła, jeśli archiwum o określonej nazwie już istnieje, zostanie zastąpione.

Wskazówka. Poziom kompresji NoCompression z reguły należy stosować do łączenia już skompresowanych plików (jpg, msi, mp3 itp.) W jeden plik archiwum, aby system nie tracił czasu na ich kompresowanie.

Przykładowe polecenie kompresji pojedynczego pliku:

Compress-Archive -Path C: \ Logs \ Update.log -DestinationPath C: \ Archive \ logs.zip -CompressionLevel Optimal


Skompresuj całą zawartość katalogu:

Compress-Archive -Path C: \ Logs \ -DestinationPath C: \ Archive \ logs-all.zip -CompressionLevel Optimal

Możesz kompresować pliki za pomocą określonej maski. Na przykład musisz spakować tylko pliki z rozszerzeniem * .txt.

Compress-Archive -Path C: \ Logs \ *. Txt -DestinationPath C: \ Archive \ logs-txt.zip -CompressionLevel Najszybszy

Uwaga. Ponieważ moduł Microsoft.PowerShell.Archive używa wywołań do klasy System.IO.Compression.ZipArchive, kompresja pliku większego niż 2 GB nie będzie możliwa. Jeśli spróbujesz skompresować większy plik, pojawi się błąd
Wyjątek wywołujący „Zapis” z argumentami „3”: „Strumień był za długi”.
W C: \ Windows \ system32 \ WindowsPowerShell \ v1.0 \ Modules \ Microsoft.PowerShell.Archive \ Microsoft.PowerShell.Archive.psm1: 805
char: 29
+... $ destStream.Write ($ buffer, 0, $ numberOfBytesRead)
+                         ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+ CategoryInfo: NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId: IOException

Aby rozpakować archiwum ZIP, użyj polecenia cmdlet Rozwiń Archiwum.
Format polecenia:

Expand-Archive [-Path] String [-DestinationPath] String [-Force] [-Confirm]

Na przykład, aby rozpakować wcześniej utworzone archiwum zip, zastępując pliki w katalogu docelowym:

Rozwiń-Archiwum -Path C: \ Scripts \ test1.zip -DestinationPath c: \ scripts -Force

Z niedociągnięć modułu archiwizującego tej wersji warto zauważyć:

  • Nie można wyświetlić zawartości archiwum bez rozpakowania
  • Części plików nie można wyodrębnić z archiwum (tylko pełna dekompresja)
  • Nie można używać innych formatów archiwów niż zip

W poprzednich wersjach Poweshell można używać klasy NET Framework 4.5 do kompresji / dekompresji plików zip Zipfile. Format używania tej klasy jest następujący.

Pakujemy pliki do archiwum:

Add-Type -Assembly „system.io.compression.filesystem”
$ src = „C: \ Logs”
$ dst = „C: \ Archive \ test.zip”
[io.compression.zipfile] :: CreateFromDirectory ($ src, $ dst)

Możesz rozpakować archiwum ZIP w następujący sposób:

Add-Type -Assembly „system.io.compression.filesystem”
$ src = "C: \ Archive \ test.zip"
$ dst = "C: \ Logs \ Archve"
[io.compression.zipfile] :: ExtractToDirectory ($ src, $ dst)