Jak można zip lub rozpakować ze skryptu przy użyciu tylko wbudowanych możliwości systemu Windows?

W Windows można zip niektóre pliki przez

Kliknij prawym przyciskiem myszy → Wyślij doskompresowany (spakowany) folder

I rozpakuj, klikając dwukrotnie plik .zip i rozpakuj pliki.

Czy istnieje sposób na zastosowanie tych umiejętności ze skryptu (.plik bat) bez konieczności instalowania oprogramowania innych firm?

Author: Peter Mortensen, 2013-07-09

18 answers

W 2013 roku nie było to możliwe. Microsoft nie dostarczył do tego żadnego pliku wykonywalnego.

Zobacz ten link dla niektórych VBS sposób, aby to zrobić. https://superuser.com/questions/201371/create-zip-folder-from-the-command-line-windows

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

 85
Author: Diryboy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-11 18:11:43

Aby rozszerzyć 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, to nie będzie działać z PowerShell 2, wymaga PowerShell 3 lub większego i. NET Framework 4.

 182
Author: Jason Duffett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-07 14:43:31

Tar

Windows 10 zawiera tar.exe:

# example 1
tar.exe -a -c -f out.zip in.txt
# example 2
tar.exe -x -f out.zip

Https://techcommunity.microsoft.com/t5/containers/-/ba-p/382409

Jeśli masz starszy System Windows, nadal możesz go pobrać:

Https://github.com/libarchive/libarchive/releases

PowerShell

# example 1
Compress-Archive in.txt out.zip
# example 2
Expand-Archive out.zip

Https://docs.microsoft.com/powershell/module/microsoft.powershell.archive

Katalog

Dla obu narzędzi, można użyć pliku lub katalogu do wprowadzania danych.

 178
Author: Steven Penny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-07 14:44:31

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

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.

 141
Author: Noam Manos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-18 11:47:11

PowerShell 5.0

Od Microsoft.PowerShell.Archive możesz użyć:

Np.:

  • Utwórz result.zip z całego folderu Test:

    Compress-Archive -Path C:\Test -DestinationPath C:\result
    
  • Wyodrębnij zawartość result.zip w podanym folderze Test:

    Expand-Archive -Path result.zip -DestinationPath C:\Test
    
 85
Author: ROMANIA_engineer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-24 22:00:42

Nie jest to do końca ZIP, ale jedynym sposobem na skompresowanie pliku za pomocą narzędzi Windows jest:

makecab <source> <dest>.cab

Do dekompresji:

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ń, makecab Advanced uses

 37
Author: Federico Santamorena,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-11 17:57:16

Korzystanie Z 7-Zip:

Zip : masz folder foo i chcesz go spakować do myzip.zip

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

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

"C:\Program Files\7-Zip\7z.exe" x  myzip.zip  -o./ -y -r
 34
Author: Monir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-21 16:39:32

Szukałem odpowiedzi na to pytanie i z moich badań wynika, że odpowiedź Diryboya wydaje się być dokładna.

Znalazłem kompakt.program exe kompresuje pliki, ale nie tworzy wysoko skompresowanego pliku (lub zestawu plików). Jest to podobne do opcji, którą otrzymujesz po kliknięciu prawym przyciskiem myszy na liście dysku lub partycji w systemie Windows. Otrzymasz opcję czyszczenia (Usuń pliki tymczasowe itp.), a także kompresji plików. Skompresowane pliki są nadal dostępne, ale są po prostu skompresowane do Utwórz miejsce na dysku, na którym jest mało miejsca.

Znalazłem też kompres.exe, który akurat mam na komputerze. Nie jest natywnie na większości maszyn z systemem windows i jest częścią zestawu zasobów 2003. Robi to skompresowany plik, ale jest bardziej podobny do plików z dysku instalacyjnego systemu windows (ma podkreślenie jako ostatni znak rozszerzenia lub nazwy pliku). I ekstrakt.polecenie exe wyodrębnia te pliki.

Jednak mantra jest, jeśli można to zrobić natywnie przez GUI to prawdopodobnie jest sposób, aby to zrobić poprzez batch, .vbs, lub innego typu skryptu w wierszu poleceń. Ponieważ system windows miał opcję "Wyślij do", aby utworzyć plik zip, wiedziałem, że musi być sposób, aby to zrobić za pomocą linii poleceń i znalazłem kilka opcji.

Oto świetny link, który pokazuje, jak zip plik za pomocą Windows native polecenia.

Https://superuser.com/questions/110991/can-you-zip-a-file-from-the-command-prompt-using-only-windows-built-in-capabili

Przetestowałem go z katalogiem zawierającym wiele zagnieżdżonych plików i folderów i działało idealnie. Po prostu postępuj zgodnie z formatem wiersza poleceń.

Istnieje również sposób rozpakowania plików za pomocą linii poleceń, które również znalazłem. Jednym ze sposobów, po prostu otwiera okno Eksploratora pokazujące, jaka jest zawartość spakowanego pliku. Niektóre z nich korzysta również Java, która niekoniecznie jest rodzima Dla windows, ale jest tak powszechna, że prawie tak się wydaje.

Https://superuser.com/questions/149489/does-windows-7-have-unzip-at-the-command-line-installed-by-default

Jak rozpakować plik za pomocą wiersza poleceń?

 9
Author: LostUser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:16

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

Nie ma potrzeby stosowania narzędzi lub zależności innych firm. Wystarczy ustawić SOURCEDIR i OUTPUTZIP.

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 sparametryzować ten plik, zastępując linię CScript _zipup.vbs %SOURCEDIR% %OUTPUTZIP% CScript _zipup.vbs %1 %2, w którym to przypadku można go jeszcze łatwiej wywołać, po prostu wywołując CALL ZipUp C:\Source\Dir C:\Archive.zip.

 8
Author: PodTech.io,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-11 18:01:20

Mam problem z tymi wszystkimi rozwiązaniami.

nie do końca same i wszystkie tworzą pliki, które mają niewielką różnicę wielkości w porównaniu do RMB --> send to --> compressed (zipped) folder, gdy są wykonane z tego samego folderu źródłowego. Najbliższa różnica wielkości jaką miałem to 300 kb różnicy (skrypt > Instrukcja), wykonana z:

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

(zwróć uwagę na -CompressionLevel. istnieją trzy możliwe wartości : Fastest , NoCompression & Optimal, (domyślnie: Optimal))

I wanted to zrób .plik bat, który powinien automatycznie skompresować folder wtyczek WordPress, nad którym pracuję, do .archiwum zip, więc mogę go wgrać 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, czarownica wydaje mi się naprawdę dziwna.

I wygenerowany skrypt .pliki zip faktycznie łamią wtyczki WordPress do tego stopnia, że nie można ich aktywować i mogą również nie być usuwane z wewnątrz WordPress. Muszę SSH do" tylnej strony " serwera i usunąć przesłane pliki wtyczek, ręcznie. Podczas gdy ręcznie generowane pliki RMB działają normalnie.

 5
Author: Sebastian Norr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-02 09:37:03

Jeśli chcesz to zrobić jako część skryptu, najlepszym sposobem jest użycie Javy. Zakładając, że katalog bin znajduje się w 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ę do niej bezpośrednio:

C:\Java\jdk1.6.0_03\bin>jar xf test.zip
 4
Author: eddyoc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-11 18:19:47

Open source to twój przyjaciel : -)

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

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

The binaries download is enough.

 3
Author: JanBorup,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-17 09:40:23

To jest zaktualizowana wersja odpowiedzi udzielonej przez @PodTech.io

Ta wersja ma poprawnie wszystkie kody vbs w pliku wsadowym. Jest również tworzony jako podprogram, który może być wywoływany pojedynczą linią 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
 3
Author: fsteff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-19 14:47:26

Mówisz, że próbujesz to zrobić bez oprogramowania innych firm. Nie jestem pewien, czy bierzesz pod uwagę. NET "Oprogramowanie innych firm".

Ale możesz utworzyć własne narzędzie wiersza poleceń w .NET. nie powinno ono wymagać więcej niż kilku linijek kodu.

Klasa ZipFile

 2
Author: NL3294,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-11 17:55:09

Dodając odpowiedź @ Jason Duffett i jej komentarze, oto skrypt, który pobiera wejście i wyjście (odpowiednio nazwa pliku i nazwa katalogu) 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%');"

Użycie:

unzip.bat path\to\file.zip path\to\output\directory
 0
Author: OfirD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-10 21:04:06

Shell.Zastosowanie

Z Powłoką.Aplikacja można emulować sposób explorer.exe zipy pliki i foldery Skrypt nazywa się zipjs.bat :

:: unzip content of a zip to given folder.content of the zip will be not preserved (-keep no).Destination will be not overwritten (-force no)
call zipjs.bat unzip -source C:\myDir\myZip.zip -destination C:\MyDir -keep no -force no

:: lists content of a zip file and full paths will be printed (-flat yes)
call zipjs.bat list -source C:\myZip.zip\inZipDir -flat yes

:: lists content of a zip file and the content will be list as a tree (-flat no)
call zipjs.bat list -source C:\myZip.zip -flat no

:: prints uncompressed size in bytes
zipjs.bat getSize -source C:\myZip.zip

:: zips content of folder without the folder itself
call zipjs.bat zipDirItems -source C:\myDir\ -destination C:\MyZip.zip -keep yes -force no

:: zips file or a folder (with the folder itslelf)
call zipjs.bat zipItem -source C:\myDir\myFile.txt -destination C:\MyZip.zip -keep yes -force no

:: unzips only part of the zip with given path inside
call zipjs.bat unZipItem -source C:\myDir\myZip.zip\InzipDir\InzipFile -destination C:\OtherDir -keep no -force yes
call zipjs.bat unZipItem -source C:\myDir\myZip.zip\InzipDir -destination C:\OtherDir 

:: adds content to a zip file
call zipjs.bat addToZip -source C:\some_file -destination C:\myDir\myZip.zip\InzipDir -keep no
call zipjs.bat addToZip -source  C:\some_file -destination C:\myDir\myZip.zip

MAKECAB

Makecab jest domyślnym narzędziem kompresji dostarczanym z systemem windows. Chociaż może używać różnych algorytmów kompresji (w tym zip) format pliku jest zawsze .cab Plik. Z niektórymi rozszerzeniami może być również używany na komputerach z Linuksem.

Kompresowanie pliku:

makecab file.txt "file.cab"

Kompresowanie całego folder wymaga trochę więcej pracy. Tutaj katalog jest skompresowany za pomocą cabDir.bat :

call cabDir.bat ./myDir compressedDir.cab

Dekompresja jest dość łatwa za pomocą expand komendy:

EXPAND cabfile -F:* .

Bardziej hakerskim sposobem jest tworzenie samorozpakowującego się pliku wykonywalnego za pomocą polecenia extract32:

copy /b "%windir%\system32\extrac32.exe"+"mycab.cab" "expandable.exe"
call expandable.exe

TAR

Z build 17063 systemu windows mamy polecenie tar:

::compress directory
tar -cvf archive.tar c:\my_dir
::extract to dir
tar -xvf archive.tar.gz -C c:\data

. net tools

. NET (i powershell) oferuje wiele sposobów kompresji i dekompresji plików. Najprościej jest ze strumieniem gzip. Skrypt nazywa się gzipjs.bat :

::zip
call gzipjs.bat -c my.file my.zip
::unzip
call gzipjs.bat -u my.zip my.file
 0
Author: npocmaka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-09 13:37:55

Aby spakować plik:

C:\> zip -9 -m -o file.dat.zip file.dat
  • -9 maksymalna kompresja
  • - m usuń oryginalny plik po udanej kompresji
  • - o ustawia datę modyfikacji pliku zip taką samą jak oryginalnego pliku
  • szkoda, że trzeba nadać mu nazwę pożądanego pliku zip zamiast tylko dodawać .rozszerzenie zip do nazwy pliku do kompresji
 -4
Author: Tulains Córdova,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-12 14:31:04

Możesz rozpakować skompresowany lub natywny plik Windows za pomocą Expand, np.

expand MyFile.zip myFile
 -5
Author: Lance,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-17 09:05:54