Come puoi comprimere o decomprimere dallo script usando SOLO le funzionalità integrate di Windows?


294

In Windows puoi comprimere alcuni file per

tasto destro → Invia aCartella compressa (zippata)

E decomprimere facendo doppio clic sul .zipfile ed estrarre i file.

C'è un modo per applicare quelle abilità da uno script (file .bat) senza la necessità di installare alcun software di terze parti ?



16
Bene, probabilmente è per chiamarlo da un file batch o da un programma. (Ecco perché sono qui: sto cercando di creare un rapido file .BAT per "costruire" un piccolo prodotto per un sito Web che richiede che sia un file zip.)
Jon Coombs,

46
Insano che questa domanda fosse chiusa.
Sam Goldberg,

1
È possibile spostare questa domanda su Super User?
Hanxue,

21
Ancora molto utile e pertinente nel 2018.: P
Michael Fever,

Risposte:


82

Nel 2013, ciò non era possibile. Microsoft non ha fornito alcun eseguibile per questo.

Vedi questo link per alcuni modi VBS per farlo. /superuser/201371/create-zip-folder-from-the-command-line-windows

Da Windows 8 in poi, .NET Framework 4.5 è installato per impostazione predefinita, con System.IO.Compression.ZipArchive e PowerShell disponibili, è possibile scrivere script per raggiungere questo obiettivo, vedere https://stackoverflow.com/a/26843122/71312


1
Ciò non è corretto dato che PS lo consente ed è preinstallato su Windows ed è disponibile dalla riga di comando.
Dan Atkinson,

4
@DanAtkinson Aggiornato. È stato risposto nel 2013, il collegamento ha fornito un modo VBS. Il modo PS richiede .Net 4.5, che richiede Windows 8 o versioni successive.
Diryboy,

Grazie per l'aggiornamento! Ho modificato il mio voto di conseguenza. :)
Dan Atkinson,

6
@MichaelMrozek Bene "riga di comando" si riferisce genericamente a qualsiasi riga di comando, non specificamente CMD / COMMAND, e PS è sicuramente una riga di comando, come lo è bash, sh, rsh su * nix. Ma solo per andare oltre, dal momento che puoi eseguire PowerShell dalla riga di comando, risponde alla domanda anche se vuoi credere che cmd / command sia l'unica e unica riga di comando.
Robert McKee,

1
E ' stato possibile tornare nel 2013 (senza installare alcun software aggiuntivo). Vedi la domanda Super User . È stato possibile da quando è uscito Windows XP nel 2001. La funzionalità ZIP integrata in Windows XP può essere sfruttata perché è esposta attraverso un'interfaccia COM .
Peter Mortensen,

180

Per espandere la soluzione PowerShell di Steven Penny, è possibile incorporarlo in un file batch chiamando powershell.exe in questo modo:

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

Come ha detto Ivan Shilo, questo non funzionerà con PowerShell 2, richiede PowerShell 3 o versioni successive e .NET Framework 4.


1
In realtà, questo è stato reso disponibile in .NET 4.5.
qJake

10
Per quelli (come me) che si chiedono come estrarre nella directory reale (invece di creare una nuova directory) è sufficiente impostare il parametro target su '.', ad esempio:powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.'); }"
Munchkin

Possiamo usare questi comandi per aumentare la compressione? Come renderlo Ultra compressione per ridurre le dimensioni del file?
Nigel Fds,

1
Qual è lo scopo di & {}? Con PS5 funziona anche questo:powershell.exe -nologo -noprofile -command "Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.');"
Roi Danton,

@RoiDanton Come utilizzare stringformatter per la definizione di src.zip e dest.zip?
PySaad,

161

A partire da .NET 4.5 , PowerShell può eseguire questa operazione:

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

Per le ultime due righe, bare foopuò essere sostituito con il nome che si desidera abbia la cartella o qualunque sia il nome della cartella preesistente. foo.zipin entrambi i casi funge da file zip per salvare come o per decomprimerlo.


17
Questo è a partire da .NET 4.5.
qJake

Possiamo usare questi comandi per aumentare la compressione? Come renderlo Ultra compressione per ridurre le dimensioni del file?
Nigel Fds,

Ho .NET v4.0.30319, v2.0.50727, v1.1.4322, v1.0.3705 installato tramite su una macchina virtuale installata da qui: developer.microsoft.com/en-us/microsoft-edge/tools/vms e questo funziona. quindi immagino che non sia necessario .NET 4.5
alpha_989

Questa è la soluzione più pratica sui sistemi moderni, questo scriverà una zip di dimensioni superiori a 2 GB, mentre lo "Compress-Archive" standard Powershell fallirà.
Shukri Adams,

135

Se hai Java installato, puoi comprimere in un archivio ZIP usando il jarcomando:

jar -cMf targetArchive.zip sourceDirectory

c = Crea un nuovo file di archivio.

M = Specifica che un file manifest non deve essere aggiunto all'archivio.

f = Indica il nome del file di destinazione.


3
fantastico, grazie, proprio quello che stavo cercando ... FYI - Ho dovuto rimuovere il carattere meno in DOS ... ad esempio jar cMf target.zip sourceDir
mlo55

3
Non male, ma è necessario che sia installato JDK, non JRE.
pdem,

2
Bella, probabilmente la soluzione più indipendente dalla piattaforma per questo;)
Adrian,

YMMD. idea fantastica. mi ha fatto risparmiare un sacco di tempo.
Gorefest,

3
È coperto da "... utilizzando SOLO le funzionalità integrate di Windows ?" (la mia enfasi)
Peter Mortensen l'

84

PowerShell 5.0

Da Microsoft.PowerShell.Archivete puoi usare:

Per esempio:

  • Crea result.zipda tutta la Testcartella:

    Compress-Archive -Path C:\Test -DestinationPath C:\result
    
  • Estrarre il contenuto di result.zipnella Testcartella specificata :

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

13
Funziona benissimo, grazie. Per chiunque finisca qui, puoi usare powershell Compress-Archive -Path C:\SomeFile.ext -DestinationPath C:\SomeFile.zipdirettamente dalla riga di comando senza dover creare uno script (supponendo che hai installato Powershell v5, che puoi fare almeno tornando a Windows 7).
Sembra il

Funziona alla grande, aggiungi l'opzione -Force se stai pianificando di rieseguirla.
Robin Salih,

1
@Beems, grazie! Ma penso che tu faccia impazzire il sentiero / destinazione al contrario?
Yiping

Funziona, ma l'archivio viene compresso in modo diverso quindi cosa succede se si utilizza Windows Explorer "Invia a -> cartella compressa (zippata)" La versione di PowerShell è più grande e alcuni programmi non possono essere estratti
Eric Labashosky,

Compress-Archive ha un limite massimo di file di 2 GB sul file di input
Sergei Rodionov,

37

Non è esattamente un ZIP, ma l'unico modo per comprimere un file usando gli strumenti di Windows è:

makecab <source> <dest>.cab

Per decomprimere:

expand <source>.cab <dest>

Esempio avanzato (da 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"

Ulteriori informazioni: makecab , espandi , makecab usi avanzati



34

Utilizzando 7-Zip:

Zip : hai una cartella fooe vuoi comprimerlamyzip.zip

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

Decomprimi : vuoi decomprimerlo ( myzip.zip) nella directory corrente ( ./)

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

31
Si prega di notare la domanda:without the need to install any 3rd party
Roee Gavirel,

16
@RoeeGavirel 7zip dovrebbe essere una delle prime cose che installi su qualsiasi installazione di Windows: P
developerbmw

3
@developerbmw - A. perché? B. Sto gestendo ~ 100 macchine in produzione che non hanno 7zip su di esse. Per installarlo dovrei ottenere DevOps installarlo su tutte quelle macchine e su tutte le nuove macchine che verranno aggiunte ai cluster. Preferirei evitarlo.
Roee Gavirel,

1
@Rolanda: potresti per favore essere spaziale; dove va storto? Questo aiuterà tutti.
Monir,

1
@Roland: appena controllato, la sintassi funziona bene. Probabilmente, stai provando con la cartella "pippo" che non è presente nella tua macchina. Indovina però.
Monir,

9

Ho cercato di rispondere a questa domanda esatta e dalla mia ricerca, la risposta di DiryBoy sembra essere accurata.

Ho trovato il programma compact.exe comprime i file ma non per creare un file altamente compresso (o set di file). È simile all'opzione che si ottiene facendo clic con il tasto destro su una lettera di unità o una partizione in Windows. È possibile eseguire la pulizia (rimuovere i file temporanei, ecc.) E comprimere i file. I file compressi sono ancora accessibili ma sono appena compressi per creare spazio su un'unità che ha poco spazio.

Ho anche trovato compress.exe che mi è capitato di avere sul mio computer. Non è nativo sulla maggior parte delle macchine Windows e fa parte del kit di risorse del 2003. Crea una specie di file zippato, ma è molto più simile ai file di un disco di installazione di Windows (ha il carattere di sottolineatura come ultimo carattere dell'estensione o del nome del file). E il comando extract.exe estrae quei file.

Tuttavia, il mantra è che, se può essere fatto in modo nativo tramite la GUI, allora c'è probabilmente un modo per farlo tramite batch, .vbs o qualche altro tipo di script all'interno della riga di comando. Dato che Windows ha avuto l'opzione 'invia a' per creare un file zip, sapevo che doveva esserci un modo per farlo tramite la riga di comando e ho trovato alcune opzioni.

Ecco un ottimo link che mostra come comprimere un file usando i comandi nativi di Windows.

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

L'ho provato con una directory contenente più file e cartelle nidificati e ha funzionato perfettamente. Segui il formato della riga di comando.

C'è anche un modo per decomprimere i file tramite riga di comando che ho trovato anche. In un modo, apre semplicemente una finestra di Explorer che mostra qual è il contenuto del file zippato. Alcuni di questi usano anche Java che non è necessariamente nativo di Windows ma è così comune che sembra quasi così.

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

Come decomprimere un file usando la riga di comando?



8

È possibile utilizzare uno script VBScript racchiuso in un file BAT. Questo codice funziona su un PERCORSO relativo.

Non sono necessari strumenti o dipendenze di terze parti. Basta impostare SOURCEDIRe OUTPUTZIP.

Nome 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

Esempio di utilizzo

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

In alternativa, puoi parametrizzare questo file sostituendo la linea CScript _zipup.vbs %SOURCEDIR% %OUTPUTZIP%con CScript _zipup.vbs %1 %2, nel qual caso può essere ancora più facilmente chiamato semplicemente chiamando CALL ZipUp C:\Source\Dir C:\Archive.zip.


La riga che crea il file zip iniziale deve essere salvata, altrimenti non finisce nello script.
Coppa

Sì, questa è la strada da percorrere (come nella domanda del Super User ).
Peter Mortensen,

Ho aggiunto una versione con escape corretta come risposta.
fsteff,

5

Ho un problema con tutte queste soluzioni.

Non sono esattamente uguali e creano tutti file con una leggera differenza di dimensioni rispetto a RMB --> send to --> compressed (zipped) folderquando sono stati creati dalla stessa cartella di origine. La differenza di dimensione più vicina che ho avuto è la differenza di 300 KB (script> manuale), realizzata con:

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

(Notare il livello -Compression . Esistono tre valori possibili : Fastest, NoCompression & Optimal, (Default: Optimal))

Volevo creare un file .bat che dovrebbe comprimere automaticamente una cartella di plugin WordPress su cui sto lavorando, in un archivio .zip, in modo da poterlo caricare sul sito WordPress e testare il plugin.

Ma per qualche motivo non funziona con nessuna di queste compressioni automatiche, ma funziona con la compressione RMB manuale, che trovo davvero strana.

E i file .zip generati dallo script in realtà rompono i plugin di WordPress al punto in cui non possono essere attivati ​​e non possono nemmeno essere eliminati da WordPress. Devo SSH nel "lato posteriore" del server ed eliminare manualmente i file dei plugin caricati. Mentre i file generati manualmente da RMB funzionano normalmente.


Che cos'è "wbr" e "RMB" ?
Peter Mortensen,

RMB = Pulsante destro del mouse. <wbr> = un tag HTML che indica una "opportunità di Word BReak" per il browser (rimosso, perché non funzionava).
Sebastian Norr,

4

Se è necessario eseguire questa operazione come parte di uno script, il modo migliore è utilizzare Java. Supponendo che la directory bin sia nel tuo percorso (nella maggior parte dei casi), puoi utilizzare la riga di comando:

jar xf test.zip

Se Java non è sul tuo percorso, fai riferimento direttamente a:

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

3

L'open source è tuo amico :-)

Ecco la decompressione : http://gnuwin32.sourceforge.net/packages/unzip.htm

Esiste anche un comando ZIP: http://gnuwin32.sourceforge.net/packages/zip.htm

Il download dei binari è sufficiente.


Su Windows 8, genera un errore: manca bzip2.dll.
Doug

1
@Doug dice che bzip2 è un requisito sulla pagina e ha un link per il download
Sam

11
La domanda originale era come usare i comandi standard di Windows integrati. Inoltre, richiedere agli utenti di installare varie soluzioni di terze parti è indesiderabile perché il proprio strumento o soluzione è ora limitato agli utenti che dispongono di autorizzazioni amministrative sul proprio computer o che non si preoccupano di una raccolta crescente di piccole dipendenze dal proprio sistema . L'open source può essere tuo amico, ma i pacchetti open source che richiedono a voi installare altri pacchetti software open source che richiedono di installare altri pacchetti Open Source e così via decisamente non tuo amico.
Steve Hollasch,

SourceForge è bloccato dalla politica del firewall del mio lavoro :-(
SnookerC

1
Questo utilizza ancora software di terze parti
Деян Добромиров

3

Questa è una versione aggiornata alla risposta fornita da @ PodTech.io

Questa versione ha tutto il codice vbs correttamente salvato nel file batch. È anche creato in una sub-routine, che può essere chiamata con una sola riga da qualsiasi punto dello script batch:

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

Dici che stai cercando di farlo senza un software di terze parti. Non sono sicuro che valuteresti il ​​software .NET "di terze parti".

Ma puoi creare la tua utility da riga di comando in .NET. Non dovrebbe richiedere più di alcune righe di codice.

Classe ZipFile


0

Aggiungendo la risposta di @Jason Duffett e i suoi commenti, ecco uno script che ottiene input e output (nome file e nome directory, rispettivamente) dall'utente:

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

Uso:

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

-4

Per comprimere un file:

C:\> zip -9 -m -o file.dat.zip file.dat
  • -9 compressione massima
  • -m cancella il file originale dopo una corretta compressione
  • -o impostare la data di modifica del file zip uguale al file originale
  • peccato che si debba dargli il nome del file zip desiderato invece di aggiungere semplicemente l'estensione .zip al nome del file da comprimere

4
due cose: (1) "zip" non è fornito con Windows, quindi probabilmente è una terza parte che hai. e come menzionato nella mia domanda, non posso installare terze parti. (2) Il motivo per cui devi fornire il nome desiderato è perché zippare crea e archivia file (come una cartella in una seduta) e potresti avere più di un file lì.
Roee Gavirel,

@RoeeGavirel Nel server ho trovato l'utilità della riga di comando zip non è installato nessuno strumento GUI di winzip, quindi ho indovinato che lo strumento CLI nudo era fornito con Windows. D'altra parte Unix / Linux comprimono utility come compress, bzip2 e gzip creano un file compresso con lo stesso nome del file originale più l'estensione (.Z, .bz2 o .gz), se non si passa il nome desiderato file compresso.
Tulains Córdova,

-4

È possibile decomprimere un file compresso nativo compresso o compresso utilizzando il comando Espandi , ad es

expand MyFile.zip myFile

9
Ci ho provato, ma copia MyFile.zip nella cartella myFile,
fhnaseer,

Questo mi ha aiutato C: \> espandi /?
snow6oy,

11
Espandi funziona solo con file .cab e non è appropriato per i file zip.
рüффп,

2
Idem gli altri commenti qui. Expand file.zip filecopia lo zip in un altro file senza l'estensione. Non decomprime lo ZIP in una cartella.
Dave Marley,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.