Können Sie eine Datei über die Eingabeaufforderung komprimieren, indem Sie NUR die in Windows integrierte Fähigkeit zum Komprimieren von Dateien verwenden?

Ich habe eine Batchdatei, die eine Textdatei ausgibt. Ich dachte, es wäre schön, wenn ich es auch zusammenpacken könnte.

Dies wird in einer unkontrollierten Umgebung verwendet, sodass ich keine Annahmen über das Vorhandensein von Softwareprodukten von Drittanbietern wie 7-Zip usw. treffen kann. Dies muss die jetzt integrierte Windows-Funktion zum Komprimieren von Dateien verwenden.

Author: Peter Mortensen, 2010-02-19

13 answers

Hier ist eine Lösung für alle Batch-Dateien (eine Variation meiner anderen Antwort), die eine Datei mit dem Namen c:\ue_english.txt und in C:\someArchive.zip:

set FILETOZIP=c:\ue_english.txt

set TEMPDIR=C:\temp738
rmdir %TEMPDIR%
mkdir %TEMPDIR%
xcopy /s %FILETOZIP% %TEMPDIR%

echo Set objArgs = WScript.Arguments > _zipIt.vbs
echo InputFolder = objArgs(0) >> _zipIt.vbs
echo ZipFile = objArgs(1) >> _zipIt.vbs
echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipIt.vbs
echo Set objShell = CreateObject("Shell.Application") >> _zipIt.vbs
echo Set source = objShell.NameSpace(InputFolder).Items >> _zipIt.vbs
echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipIt.vbs
echo wScript.Sleep 2000 >> _zipIt.vbs

CScript  _zipIt.vbs  %TEMPDIR%  C:\someArchive.zip

pause

Schreibzugriff auf das übergeordnete Element des in TEMPDIR gespeicherten Ordners ist erforderlich. Da dies oft nicht der Fall ist, kann es sein, dass der Stamm des Laufwerks C TEMPDIR geändert werden muss.

Schreibzugriff ist auch für den Ordner erforderlich, in dem sich das Skript .bat befindet (da dort eine Datei generiert wird).

Beachten Sie außerdem, dass die Dateierweiterung für die komprimierte Datei .zip. Versuche, eine andere Erweiterung zu verwenden, können zu einem Skriptfehler führen. Generieren Sie stattdessen die Datei .zip und benennen Sie sie um.

 89
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-02-01 16:32:31

Es ist möglich, Zip-Dateien ohne Installation von zusätzlicher Software (Ich habe es getestet). Die Lösung ist:

Führen Sie dies in einem Befehlszeilenfenster aus, um eine ZIP-Datei zu erstellen named C:\someArchive.zip enthält alle Dateien im Ordner C:\test3:

CScript  zip.vbs  C:\test3  C:\someArchive.zip

Wobei Datei zip.vbs enthält:

' Get command-line arguments.
Set objArgs = WScript.Arguments
Set FS = CreateObject("Scripting.FileSystemObject")
InputFolder = FS.GetAbsolutePathName(objArgs(0))
ZipFile = FS.GetAbsolutePathName(objArgs(1))

' Create an empty ZIP file.
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)

Set objShell = CreateObject("Shell.Application")

Set source = objShell.NameSpace(InputFolder).Items

objShell.NameSpace(ZipFile).CopyHere(source)

' Required to let the ZIP command execute
' If this script randomly fails or the ZIP file is not complete,
' just increase to more than 2 seconds
wScript.Sleep 2000

Ich habe es nicht auf Pfade und Dateinamen getestet, die Leerzeichen enthalten. Es kann funktionieren, wenn Zitate werden um die Befehlszeilenparameter gelegt.


Wie es funktioniert: die eingebaute zip-Funktionalität in Windows (Windows XP und höher?) wird über COM - Schnittstellen aus der Windows-Shell Explorer verfügbar gemacht.exe - das ist die " Shell.Anwendung " Teil. Diese COM-Schnittstelle kann über ein VBScript - Skript verwendet werden, da ein solches Skript auf COM-Komponenten zugreifen kann. Um das Skript vollständig autark zu machen, wird zunächst eine leere ZIP-Datei erstellt (man kann auch eine leere ZIP-Datei erstellen und zusammen mit dem VBScript in das Zielsystem kopieren Skript).

VBScript wurde standardmäßig in jeder Desktop-Version von Microsoft Windows seit Windows 98 installiert.

CScript.exe ist Teil von Windows Script Host. Windows Script Host wird standardmäßig unter Windows 98 und späteren Windows-Versionen verteilt und installiert. Es wird auch installiert, wenn Internet Explorer 5 (oder eine neuere Version) installiert ist.

 40
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-09-19 16:10:32

Wenn Sie offen für die Verwendung sind PowerShell, zip-Funktionen sind in. NET 2.0 verfügbar (PowerShell ist. NET). Hier ist ein Beispiel (Quelle) kredit an Mike Hodnick:

########################################################
# out-zip.ps1
#
# Usage:
#    To zip up some files:
#       ls c:\source\*.txt | out-zip c:\target\archive.zip $_
#
#    To zip up a folder:
#       gi c:\source | out-zip c:\target\archive.zip $_
########################################################

$path = $args[0]
$files = $input

if (-not $path.EndsWith('.zip')) {$path += '.zip'} 

if (-not (test-path $path)) { 
  set-content $path ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
} 

$ZipFile = (new-object -com shell.application).NameSpace($path) 
$files | foreach {$zipfile.CopyHere($_.fullname)}
 12
Author: Beaner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2010-03-16 20:37:29

Windows 10 build 17063 oder später gebündelt ist, mit tar.exe, die mit ZIP-Dateien über die Befehlszeile arbeiten kann.

tar.exe -xf archive.zip

Oder um ein Archiv zu erstellen:

tar.exe -cf Test.zip Test
 9
Author: venimus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-06-07 11:37:23

Sie können das Risiko einer Zeitüberschreitung während der Komprimierung ausschließen, indem Sie nach dem Vorhandensein des Komprimierungsdialogfensters fragen. Diese Methode behandelt auch das Abbrechen des Benutzers aus dem Komprimierungsfenster.

objShell.NameSpace(ZipFile).CopyHere(source)

' Wait for compression window to open
set scriptShell = CreateObject("Wscript.Shell")
Do While scriptShell.AppActivate("Compressing...") = FALSE   
   WScript.Sleep 500 ' Arbitrary polling delay
Loop  

' Wait for compression to complete before exiting script
Do While scriptShell.AppActivate("Compressing...") = TRUE   
   WScript.Sleep 500 ' Arbitrary polling delay
Loop
 7
Author: George Yockey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2011-11-23 01:13:50

Wenn Sie die Resource Kit Tools installieren können, finden Sie ein Befehlszeilentool namens COMPRESS, mit dem komprimierte Archivdateien wie zip erstellt werden können.

Microsoft (R) File Compression Utility  Version 5.00.2134.1
Copyright (C) Microsoft Corp. 1990-1999.  All rights reserved.

Compresses one or more files.

COMPRESS [-r] [-d] [-z] Source Destination
COMPRESS -r [-d] [-z] Source [Destination]

  -r            Rename compressed files.
  -d            Update compressed files only if out of date.
  -zx           LZX compression.
  -z            MS-ZIP compression.
  -zq[n]        Quantum compression and optional level
                (in range 1-7, default is 4).
  Source        Source file specification.  Wildcards may be used.
  Destination   Destination file | path specification.
                Destination may be a directory.
                If Source is multiple files and -r is not specified,
                Destination must be a directory.
 5
Author: cowgod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2010-02-19 20:29:14
'Keep script waiting until compression is done
Do Until objShell.NameSpace( ZipFile ).Items.Count = objShell.NameSpace( InputFolder ).Items.Count
    WScript.Sleep 200
Loop
 3
Author: Jiří Kočara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2012-08-07 08:15:10

Mehrere Dateien / Verzeichnisse mit vereinfachtem Code.

cscript zip.vbs target.zip sourceFile1 sourceDir2 ... sourceObjN

- Reißverschluss.vbs-Datei -

Set objArgs = WScript.Arguments
ZipFile = objArgs(0)

' Create empty ZIP file and open for adding
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)
Set zip = CreateObject("Shell.Application").NameSpace(ZipFile)

' Add all files/directories to the .zip file
For i = 1 To objArgs.count-1
  zip.CopyHere(objArgs(i))
  WScript.Sleep 10000 'REQUIRED!! (Depending on file/dir size)
Next
 2
Author: Olc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2012-11-05 21:17:56

Dies ist eine mutation der akzeptierten Antwort. Ich mache eine Menge Automatisierungsaufgaben für bis zu Tausende von Dateien gleichzeitig, sodass ich nicht nur 2 Sekunden schlafen kann und mich nicht darum kümmere. Ich habe hier die Problemumgehung gefunden, die auch der Antwort von Jiří Kočara ähnelt hier.

Dadurch wird der Zielordner alle 200 ms angepingt, was ungefähr so schnell ist, wie Microsoft sagt, um nach Dateisystemupdates zu suchen.

Set parameters = WScript.Arguments
Set FS = CreateObject("Scripting.FileSystemObject")
SourceDir = FS.GetAbsolutePathName(parameters(0))
ZipFile = FS.GetAbsolutePathName(parameters(1))
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)
Set shell = CreateObject("Shell.Application")
Set source_objects = shell.NameSpace(SourceDir).Items
Set ZipDest = shell.NameSpace(ZipFile)
Count=ZipDest.Items().Count
shell.NameSpace(ZipFile).CopyHere(source_objects)
Do While Count = ZipDest.Items().Count
    wScript.Sleep 200
Loop
 2
Author: kayleeFrye_onDeck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-06-07 11:39:11

Wenn auf Windows 8 oder Windows Server 2012 Sie haben PowerShell und . NET 4.5, so können Sie dies tun:

Zip. ps1 (Verwendung: -directory <directory to zip up> -name <zip name>):

param (
    [string]$directory,
    [string]$name
)

Add-Type -Assembly System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::CreateFromDirectory($directory, $name, [System.IO.Compression.CompressionLevel]::Optimal, $false)

Zip.bat (wenn Sie einen Helfer benötigen, um PowerShell für Sie aufzurufen, ist das Verzeichnis das erste Argument und der ZIP-Name das zweite):

@Echo Off
powershell -ExecutionPolicy ByPass -Command "& '%~dpn0.ps1' -directory '%1' -name '%2'"
 1
Author: Hashbrown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-06-07 11:40:09

Hier ist mein Versuch, die integrierten Funktionen in Windows zum Komprimieren und Dekomprimieren zusammenzufassen - Wie kann ich Dateien und Ordner mit Batch-Dateien komprimieren (/ zip ) und entpacken (/ entpacken), ohne externe Tools zu verwenden? - mit ein paar gegebenen Lösungen, die auf fast jedem Windows-Computer funktionieren sollten.

In Bezug auf die Shell .anwendung und WSH, Ich bevorzugte die JScript one da es eine hybride Batch/JScript-Datei (mit .Fledermaus erweiterung), die keine temporären Dateien erfordert. Ich habe Unzip-und Zip-Funktionen in eine Datei plus ein paar weitere Funktionen eingefügt.

 1
Author: npocmaka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-06-07 11:53:50

Es gibt eine einzige, einfache cmd.exe-Befehl dafür (über PowerShell v5.0+).

Zu zip:

powershell Compress-Archive -LiteralPath 'C:\mypath\testfile.txt' -DestinationPath "C:\mypath\Test.zip"

Zum Entpacken:

powershell Expand-Archive -LiteralPath "C:\mypath\Test.Zip" -DestinationPath "C:\mypath" -Force

Quellen:

Besonderer Dank geht an @Ramhound.

 0
Author: cowlinator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-06-07 11:35:41

Die Windows-Befehlszeile bietet jetzt den Befehl COMPACT, der, soweit ich das beurteilen kann, in Windows nativ ist. Das sollte die angeforderten Anforderungen erfüllen, es sei denn, ich habe etwas verpasst.

 -5
Author: user228211,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-06-07 11:14:45