Wie können Sie das Skript mit NUR den integrierten Funktionen von Windows komprimieren oder entpacken?

294

In Windows können Sie einige Dateien mit komprimieren

Rechtsklick → Senden anKomprimierter (komprimierter) Ordner

Und entpacken Sie durch Doppelklick auf die .zipDatei und extrahieren Sie die Dateien.

Gibt es eine Möglichkeit, diese Fähigkeiten aus einem Skript (.bat-Datei) anzuwenden, ohne dass Software von Drittanbietern installiert werden muss ?

Roee Gavirel
quelle
16
Nun, es ist wahrscheinlich, um es aus einer Batch-Datei oder einem Programm aufzurufen. (Deshalb bin ich hier und versuche, eine schnelle .BAT-Datei zu erstellen, um ein kleines Produkt für eine Website zu "erstellen", für die eine Zip-Datei erforderlich ist.)
Jon Coombs
46
Wahnsinn, dass diese Frage geschlossen wurde.
Sam Goldberg
1
Ist es möglich, diese Frage an Super User zu verschieben?
Hanxue
21
Immer noch sehr nützlich und relevant im Jahr 2018 .: P
Michael Fever

Antworten:

82

Das war 2013 noch nicht möglich. Microsoft hat hierfür keine ausführbare Datei bereitgestellt.

Unter diesem Link finden Sie eine VBS-Methode, um dies zu tun. /superuser/201371/create-zip-folder-from-the-command-line-windows

Ab Windows 8 wird .NET Framework 4.5 standardmäßig installiert. Wenn System.IO.Compression.ZipArchive und PowerShell verfügbar sind, können Sie dazu Skripts schreiben (siehe https://stackoverflow.com/a/26843122/71312)

Diryboy
quelle
1
Dies ist nicht korrekt, da PS dies zulässt und unter Windows vorinstalliert ist und über die Befehlszeile verfügbar ist.
Dan Atkinson
4
@ DanAtkinson Aktualisiert. Es wurde bereits 2013 beantwortet, der Link lieferte einen VBS-Weg. Der PS-Weg benötigt .Net 4.5, das Windows 8 oder höher benötigt.
Diryboy
Danke für das Update! Habe meine Stimme entsprechend geändert. :)
Dan Atkinson
6
@MichaelMrozek Nun, "Befehlszeile" bezieht sich generisch auf jede Befehlszeile, nicht speziell auf CMD / COMMAND, und PS ist definitiv eine Befehlszeile, ebenso wie bash, sh, rsh auf * nix. Um nur noch einen Schritt weiter zu gehen: Da Sie Powershell über die Befehlszeile ausführen können, wird die Frage auch dann beantwortet, wenn Sie glauben möchten, dass cmd / command die einzige Befehlszeile ist.
Robert McKee
1
Dies war bereits 2013 möglich (ohne Installation zusätzlicher Software). Siehe die Super User-Frage . Dies ist seit der Veröffentlichung von Windows XP im Jahr 2001 möglich. Die in Windows XP integrierte ZIP-Funktionalität kann genutzt werden, da sie über eine COM-Schnittstelle verfügbar gemacht wird .
Peter Mortensen
180

Um die PowerShell-Lösung von Steven Penny zu erweitern, können Sie sie in eine Batch-Datei einbinden, indem Sie Powershell.exe wie folgt aufrufen:

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

Wie Ivan Shilo sagte, funktioniert dies nicht mit PowerShell 2, sondern erfordert PowerShell 3 oder höher und .NET Framework 4.

Jason Duffett
quelle
1
Eigentlich wurde dies in .NET 4.5 zur Verfügung gestellt.
qJake
10
Für diejenigen (wie ich), die sich fragen, wie sie in das eigentliche Verzeichnis extrahieren sollen (anstatt ein neues Verzeichnis zu erstellen), setzen Sie einfach den Zielparameter auf '.', z. B.:powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.'); }"
Munchkin
Können wir diese Befehle verwenden, um die Komprimierung zu erhöhen? Wie machen Sie es Ultra-Komprimierung, um die Dateigröße zu reduzieren?
Nigel Fds
1
Was ist der Zweck von & {}? Mit PS5 funktioniert das auch:powershell.exe -nologo -noprofile -command "Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.');"
Roi Danton
@RoiDanton Wie verwende ich Stringformatter zum Definieren von src.zip und dest.zip?
PySaad
161

Ab .NET 4.5 kann PowerShell Folgendes tun:

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

Für die letzten beiden Zeilen barund fookann durch den Namen ersetzt werden, den der Ordner haben soll, oder wie auch immer der Name des bereits vorhandenen Ordners lautet. foo.zipIn beiden Fällen fungiert es als Zip-Datei zum Speichern oder Entpacken.

Steven Penny
quelle
17
Dies ist ab .NET 4.5.
QJake
Können wir diese Befehle verwenden, um die Komprimierung zu erhöhen? Wie machen Sie es Ultra-Komprimierung, um die Dateigröße zu reduzieren?
Nigel Fds
Ich habe .NET v4.0.30319, v2.0.50727, v1.1.4322, v1.0.3705 über eine von hier installierte VM installiert: developer.microsoft.com/en-us/microsoft-edge/tools/vms , und dies funktioniert. Ich
vermute,
Dies ist die praktischste Lösung für moderne Systeme. Dadurch wird ein Reißverschluss mit einer Größe von mehr als 2 GB geschrieben, während das Standard-Powershell "Compress-Archive" fehlschlägt.
Shukri Adams
135

Wenn Sie Java installiert haben, können Sie mit dem folgenden jarBefehl in ein ZIP-Archiv komprimieren :

jar -cMf targetArchive.zip sourceDirectory

c = Erstellt eine neue Archivdatei.

M = Gibt an, dass keine Manifestdatei zum Archiv hinzugefügt werden soll.

f = Gibt den Namen der Zieldatei an.

Noam Manos
quelle
3
Super, danke, genau das, wonach ich gesucht habe ... FYI - Ich musste das Minuszeichen unter DOS entfernen ... zB jar cMf target.zip sourceDir
mlo55
3
Nicht schlecht, aber Sie müssen das JDK installiert haben, nicht die JRE.
pdem
2
Schöne, wahrscheinlich plattformunabhängigste Lösung dafür;)
Adrian
YMMD. tolle Idee. hat mir viel Zeit gespart.
Gorefest
3
Ist das die unter „... mit nur Windows- Einbau- Fähigkeiten?“ (meine Betonung)
Peter Mortensen
84

PowerShell 5.0

Von können Microsoft.PowerShell.ArchiveSie verwenden:

Z.B:

  • result.zipAus dem gesamten TestOrdner erstellen :

    Compress-Archive -Path C:\Test -DestinationPath C:\result
    
  • Extrahieren Sie den Inhalt von result.zipim angegebenen TestOrdner:

    Expand-Archive -Path result.zip -DestinationPath C:\Test
    
ROMANIA_engineer
quelle
13
Das funktioniert super, danke. Für alle, die hier unten landen, können Sie powershell Compress-Archive -Path C:\SomeFile.ext -DestinationPath C:\SomeFile.zipdirekt über die Befehlszeile arbeiten, ohne ein Skript erstellen zu müssen (vorausgesetzt, Sie haben Powershell v5 installiert, was Sie zumindest unter Windows 7 tun können).
Beems
Funktioniert hervorragend, fügen Sie die Option -Force hinzu, wenn Sie sie erneut ausführen möchten.
Robin Salih
1
@ Beems, danke! Aber ich denke du bist verrückt nach dem Weg / Ziel umgekehrt?
Yiping
Dies funktioniert, aber das Archiv ist anders komprimiert als wenn Sie den Windows Explorer "Gesendet an -> komprimierter (komprimierter) Ordner" verwenden. Die Powershell-Version ist größer und einige Programme können nicht extrahieren
Eric Labashosky
Compress-Archive hat ein maximales Dateilimit von 2 GB für die Eingabedatei
Sergei Rodionov
37

Es ist nicht gerade eine ZIP-Datei, aber die einzige Möglichkeit, eine Datei mit Windows-Tools zu komprimieren, ist:

makecab <source> <dest>.cab

So dekomprimieren Sie:

expand <source>.cab <dest>

Erweitertes Beispiel (von 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"

Weitere Informationen: makecab , expand , makecab für fortgeschrittene Zwecke

Federico Santamorena
quelle
34

Verwenden von 7-Zip:

Zip : Sie haben einen Ordner foound möchten ihn komprimierenmyzip.zip

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

Entpacken : Sie möchten es ( myzip.zip) in das aktuelle Verzeichnis entpacken ( ./)

"C:\Program Files\7-Zip\7z.exe" x  myzip.zip  -o./ -y -r
Monir
quelle
31
Bitte beachten Sie die Frage:without the need to install any 3rd party
Roee Gavirel
16
@RoeeGavirel 7zip sollte eines der ersten Dinge sein, die Sie auf jeder Windows-Installation installieren: P
Developerbmw
3
@developerbmw - A. Warum ist es? B. Ich beschäftige ~ 100 Maschinen in der Produktion, auf denen kein 7zip installiert ist. Um dies zu installieren, müsste DevOps es auf all diesen Computern und auf allen neuen Computern installieren, die den Clustern hinzugefügt werden. Ich würde es lieber vermeiden.
Roee Gavirel
1
@ Roland: Könnten Sie bitte räumlich sein; wo geht es schief Das wird allen helfen.
Monir
1
@ Roland: Gerade überprüft, die Syntax funktioniert gut. Wahrscheinlich versuchen Sie es mit dem Ordner "foo", der auf Ihrem Computer nicht vorhanden ist. Aber raten Sie mal.
Monir
9

Ich habe versucht, genau diese Frage zu beantworten, und nach meinen Recherchen scheint die Antwort von DiryBoy korrekt zu sein.

Ich habe festgestellt, dass das Programm compact.exe Dateien komprimiert, aber keine stark komprimierte Datei (oder einen Satz von Dateien) erstellt. Dies ähnelt der Option, die Sie erhalten, wenn Sie in Windows mit der rechten Maustaste auf einen Laufwerksbuchstaben oder eine Partition klicken. Sie haben die Möglichkeit, Bereinigungen durchzuführen (temporäre Dateien usw. zu entfernen) sowie Dateien zu komprimieren. Auf die komprimierten Dateien kann weiterhin zugegriffen werden, sie werden jedoch nur komprimiert, um Speicherplatz auf einem Laufwerk mit wenig Speicherplatz zu schaffen.

Ich habe auch compress.exe gefunden, die ich zufällig auf meinem Computer hatte. Es ist auf den meisten Windows-Computern nicht nativ und Teil des 2003 Resource Kits. Es erstellt zwar eine Art komprimierte Datei, ähnelt jedoch eher Dateien von einer Windows-Setup-Festplatte (hat den Unterstrich als letztes Zeichen der Dateierweiterung oder des Namens). Und der Befehl extract.exe extrahiert diese Dateien.

Das Mantra lautet jedoch: Wenn es nativ über die GUI ausgeführt werden kann, gibt es wahrscheinlich eine Möglichkeit, dies über Batch, .vbs oder eine andere Art von Skript in der Befehlszeile zu tun. Da Windows die Option "Senden an" zum Erstellen einer Zip-Datei hatte, wusste ich, dass es eine Möglichkeit geben musste, dies über die Befehlszeile zu tun, und fand einige Optionen.

Hier ist ein großartiger Link, der zeigt, wie eine Datei mit nativen Windows-Befehlen komprimiert wird.

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

Ich habe es mit einem Verzeichnis getestet, das mehrere verschachtelte Dateien und Ordner enthält, und es hat perfekt funktioniert. Folgen Sie einfach dem Format der Befehlszeile.

Es gibt auch eine Möglichkeit, die Dateien über die Befehlszeile zu entpacken, die ich ebenfalls gefunden habe. Eine Möglichkeit besteht darin, ein Explorer-Fenster zu öffnen, in dem der Inhalt der komprimierten Datei angezeigt wird. Einige von ihnen verwenden auch Java, das nicht unbedingt für Windows typisch ist, aber so häufig vorkommt, dass es fast so scheint.

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

Wie entpacke ich eine Datei über die Kommandozeile?

LostUser
quelle
Nein, DiryBoys Antwort ist nicht korrekt
Peter Mortensen
8

Sie können ein VBScript-Skript verwenden, das in eine BAT-Datei eingeschlossen ist. Dieser Code arbeitet mit einem relativen PFAD.

Es sind keine Tools oder Abhängigkeiten von Drittanbietern erforderlich. Einfach einstellen SOURCEDIRund OUTPUTZIP.

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

Anwendungsbeispiel

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

Alternativ können Sie diese Datei parametrisieren , indem Sie die Linie ersetzt CScript _zipup.vbs %SOURCEDIR% %OUTPUTZIP%mit CScript _zipup.vbs %1 %2, in diesem Fall kann es sogar noch einfacher aus einfach durch Aufruf aufgerufen werden CALL ZipUp C:\Source\Dir C:\Archive.zip.

PodTech.io
quelle
Die Zeile, in der die anfängliche Zip-Datei erstellt wird, muss maskiert werden, da sie sonst nicht im Skript landet.
Tasse
Ja, dies ist der richtige Weg (wie in der Super User-Frage ).
Peter Mortensen
Als Antwort habe ich eine ordnungsgemäß maskierte Version hinzugefügt.
fsteff
5

Ich habe ein Problem mit all diesen Lösungen.

Sie sind nicht genau gleich und erstellen alle Dateien, die einen geringfügigen Größenunterschied zu den Dateien aufweisen, die RMB --> send to --> compressed (zipped) folderaus demselben Quellordner stammen. Der größte Größenunterschied, den ich hatte, ist 300 KB Unterschied (Skript> Handbuch), hergestellt mit:

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

(Beachten Sie die -CompressionLevel . Es gibt drei mögliche Werte : Fastest, NoCompression & Optimal, (Standard: Optimal))

Ich wollte eine .bat-Datei erstellen, die einen WordPress-Plugin-Ordner, an dem ich arbeite, automatisch in ein .zip-Archiv komprimiert, damit ich sie auf die WordPress-Site hochladen und das Plugin testen kann.

Aber aus irgendeinem Grund funktioniert es mit keiner dieser automatischen Komprimierungen, aber mit der manuellen RMB-Komprimierung, was ich wirklich seltsam finde.

Und die vom Skript generierten ZIP-Dateien brechen die WordPress-Plugins tatsächlich so weit, dass sie nicht mehr aktiviert werden können und auch nicht aus WordPress heraus gelöscht werden können. Ich muss SSH in die "Rückseite" des Servers und die hochgeladenen Plugin-Dateien selbst manuell löschen. Während die manuell RMB-generierten Dateien normal funktionieren.

Sebastian Norr
quelle
Was ist "wbr" und "RMB" ?
Peter Mortensen
RMB = rechte Maustaste. <wbr> = ein HTML-Tag, das dem Browser eine "Word BReak-Gelegenheit" anzeigt (entfernt, weil es nicht funktioniert hat).
Sebastian Norr
4

Wenn Sie dies als Teil eines Skripts tun müssen, verwenden Sie am besten Java. Angenommen, das Verzeichnis bin befindet sich in Ihrem Pfad (in den meisten Fällen), können Sie die Befehlszeile verwenden:

jar xf test.zip

Wenn sich Java nicht auf Ihrem Pfad befindet, verweisen Sie direkt darauf:

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

Open Source ist dein Freund :-)

Hier ist das Entpacken : http://gnuwin32.sourceforge.net/packages/unzip.htm

Es gibt auch einen ZIP-Befehl: http://gnuwin32.sourceforge.net/packages/zip.htm

Der Download der Binärdateien reicht aus.

JanBorup
quelle
Unter Windows 8 wird ein Fehler ausgegeben: bzip2.dll fehlt.
Doug
1
@ Doug es heißt, dass bzip2 eine Anforderung auf der Seite ist und einen Link zum Herunterladen hat
Sam
11
Die ursprüngliche Frage war, wie standardmäßige integrierte Windows-Befehle verwendet werden. Darüber hinaus ist es unerwünscht, dass Ihre Benutzer verschiedene Lösungen von Drittanbietern installieren müssen, da Ihr eigenes Tool oder Ihre eigene Lösung jetzt auf Benutzer beschränkt ist, die über Administratorrechte auf ihrem Computer verfügen oder sich nicht um eine wachsende Anzahl kleiner Abhängigkeiten von ihrem System kümmern . Open Source mag Ihr Freund sein, aber Open Source-Pakete, für die Sie andere Open Source-Pakete installieren müssen, für die Sie andere Open Source-Pakete usw. installieren müssen, sind definitiv nicht Ihr Freund.
Steve Hollasch
SourceForge wird durch die Firewall-Richtlinie meiner Arbeit blockiert :-(
SnookerC
1
Dies verwendet immer noch Sotware von Drittanbietern
23еян Добромиров
3

Dies ist eine aktualisierte Version der Antwort von @ PodTech.io

In dieser Version ist der gesamte vbs-Code korrekt in der Batch-Datei maskiert. Es wird auch in einer Unterroutine erstellt, die mit einer einzelnen Zeile von überall in Ihrem Batch-Skript aufgerufen werden kann:

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

Sie sagen, Sie versuchen dies ohne Software von Drittanbietern. Ich bin mir nicht sicher, ob Sie .NET-Software von Drittanbietern in Betracht ziehen würden.

Sie können jedoch in .NET ein eigenes Befehlszeilenprogramm erstellen. Es sollten nicht mehr als ein paar Codezeilen erforderlich sein.

ZipFile-Klasse

NL3294
quelle
0

Nach der Antwort von @Jason Duffett und seinen Kommentaren gibt es hier ein Skript, das vom Benutzer Eingabe und Ausgabe (Dateiname bzw. Verzeichnisname) erhält :

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

Verwendungszweck:

unzip.bat path\to\file.zip path\to\output\directory
HeyJude
quelle
-4

So komprimieren Sie eine Datei:

C:\> zip -9 -m -o file.dat.zip file.dat
  • -9 maximale Komprimierung
  • -m Originaldatei nach erfolgreicher Komprimierung löschen
  • -o das Änderungsdatum der Zip-Datei auf das gleiche wie die Originaldatei einstellen
  • Schade, dass man ihm den Namen der gewünschten Zip-Datei geben muss, anstatt nur die ZIP-Erweiterung zum Namen der zu komprimierenden Datei hinzuzufügen
Tulains Córdova
quelle
4
Zwei Dinge: (1) "zip" ist nicht mit Windows ausgestattet, es handelt sich also wahrscheinlich um einen Drittanbieter. und wie in meiner Frage erwähnt, kann ich keine Drittanbieter installieren. (2) Der Grund, warum Sie den gewünschten Namen angeben müssen, liegt darin, dass Sie beim Erstellen und Archivieren von Dateien (wie einem Ordner in einer Seance) komprimiert sind und möglicherweise mehr als eine Datei dort haben.
Roee Gavirel
@RoeeGavirel Auf dem Server, auf dem ich das Befehlszeilenprogramm zip gefunden habe, ist kein Winzip-GUI-Tool installiert, sodass ich vermutete, dass das nackte CLI-Tool mit Windows geliefert wurde. Auf der anderen Seite erstellen Unix / Linux-Komprimierungsdienstprogramme wie compress, bzip2 und gzip eine komprimierte Datei mit demselben Namen wie die Originaldatei und der Erweiterung (.Z, .bz2 oder .gz), wenn Sie den gewünschten Namen nicht übergeben komprimierte Datei.
Tulains Córdova
-4

Sie können eine komprimierte oder native komprimierte Windows-Datei mit dem Befehl Erweitern dekomprimieren , z

expand MyFile.zip myFile
Lanze
quelle
9
Ich habe das versucht, aber es kopiert MyFile.zip in den Ordner myFile,
fhnaseer
Das hat mir geholfen C: \> expand /?
snow6oy
11
Erweitern funktioniert nur mit CAB-Dateien und ist nicht für Zip-Dateien geeignet.
рüффп
2
Das Gleiche gilt für die anderen Kommentare hier. Expand file.zip fileKopiert einfach die Zip-Datei in eine andere Datei ohne die Erweiterung. Die ZIP-Datei wird nicht in einen Ordner dekomprimiert.
Dave Marley