2010-02-19 19:46:23 +0000 2010-02-19 19:46:23 +0000
113
113
Advertisement

Können Sie eine Datei von der Eingabeaufforderung aus zippen, indem Sie NUR die in Windows eingebaute Funktion zum Zippen von Dateien verwenden?

Advertisement

Ich habe eine Batch-Datei, die eine Textdatei ausgibt. Ich dachte, es wäre nett, wenn ich sie auch zippen könnte.

Diese wird in einer unkontrollierten Umgebung verwendet, daher kann ich keine Vermutungen über das Vorhandensein von Softwareprodukten von Drittanbietern wie 7-Zip usw. anstellen. Dazu muss die jetzt in Windows eingebaute Fähigkeit zum Zippen von Dateien genutzt werden.

Advertisement
Advertisement

Antworten (12)

86
86
86
2010-02-22 17:28:45 +0000

Hier ist eine Batchdatei-Lösung (eine Variation meiner anderen Antwort), die eine Datei mit dem Namen c:\ue_english.txt komprimiert und in C:\someArchive.zip ablegt:

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 ist auf den übergeordneten Ordner erforderlich, der in TEMPDIR gespeichert ist. Da dies für das Stammverzeichnis von Laufwerk C oft nicht der Fall ist, muss TEMPDIR eventuell geändert werden.

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

Beachten Sie bitte auch, dass die Dateierweiterung für die komprimierte Datei .zip lauten muss. Der Versuch, eine andere Erweiterung zu verwenden, kann zu einem Skriptfehler führen. Generieren Sie stattdessen die Datei .zip und benennen Sie sie um.

40
40
40
2010-02-20 15:48:33 +0000

Es ist möglich, Dateien ohne Installation zusätzlicher Software zu zippen (ich habe es getestet). Die Lösung ist:

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

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

Wo die 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 mit Leerzeichen getestet. Es kann funktionieren, wenn die Befehlszeilenparameter in Anführungszeichen gesetzt werden.


Wie es funktioniert: Die eingebaute Zip-Funktionalität in Windows (Windows XP und höher?) wird über COM -Schnittstellen aus der Windows-Shell, explorer.exe - das ist der “Shell.Application”-Teil. Diese COM-Schnittstelle kann von einem VBScript -Skript aus verwendet werden, da ein solches Skript auf COM-Komponenten zugreifen kann. Um das Skript vollständig in sich abgeschlossen zu machen, erstellt es eine leere ZIP-Datei für den Anfang (man könnte auch eine leere ZIP-Datei erstellen und sie zusammen mit dem VBScript-Skript auf das Zielsystem kopieren).

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

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

12
Advertisement
12
12
2010-02-19 21:59:36 +0000
Advertisement

Wenn Sie offen für die Verwendung von * PowerShell ** sind, sind Zip-Funktionen in .NET 2.0 verfügbar (PowerShell ist .NET). Hier ist ein Beispiel Quelle ) Gutschrift 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)}
7
7
7
2011-11-23 00:47:36 +0000

Sie können das Risiko von Zeitüberschreitungen während der Komprimierung eliminieren, indem Sie nach der Existenz des Komprimierungs-Dialogfensters fragen. Diese Methode behandelt auch das Abbrechen des Benutzers außerhalb des Komprimierungsfensters.

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
5
Advertisement
5
5
2010-02-19 20:29:14 +0000
Advertisement

Wenn Sie in der Lage sind, die Resource Kit Tools zu installieren, finden Sie ein Befehlszeilen-Tool namens COMPRESS, das komprimierte Archivdateien wie zip erstellen kann.

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.
3
3
3
2012-08-07 07:46:33 +0000
'Keep script waiting until compression is done
Do Until objShell.NameSpace( ZipFile ).Items.Count = objShell.NameSpace( InputFolder ).Items.Count
    WScript.Sleep 200
Loop
2
Advertisement
2
2
2017-06-07 21:53:59 +0000
Advertisement

Dies ist eine Mutation der akzeptierten Antwort. Ich erledige eine Tonne von Automatisierungsaufgaben an bis zu Tausenden von Dateien gleichzeitig, so dass ich nicht einfach 2 Sekunden lang schlafen kann und mich nicht darum kümmert. Ich habe die Problemumgehung gefunden hier , die auch der Antwort von Jiří Kočara hier ähnlich ist.

Dadurch wird der Zielordner alle 200 ms angeheftet, was ungefähr so schnell ist, wie Microsoft sagt, um nach FS-Updates 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
2
2
2012-11-05 21:06:59 +0000

Mehrere Dateien/Verzeichnisse mit vereinfachtem Code

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

zip.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
1
Advertisement
1
1
2015-01-22 12:31:49 +0000
Advertisement

Hier ist mein Versuch, die eingebauten Fähigkeiten von Fenstern zur Komprimierung und Entkomprimierung zusammenzufassen - https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders-with-batch-f

mit ein paar vorgegebenen Lösungen, die auf fast jedem Windows-Rechner funktionieren sollten.

Was die shell.application und WSH betrifft, habe ich das jscript bevorzugt, da es eine hybride Batch-/jscript-Datei (mit .bat-Erweiterung) erlaubt, die keine temporären Dateien benötigt.

1
1
1
2019-08-20 13:24:16 +0000

Windows 10 Build 17063 oder höher ist mit tar.exe gebündelt, das in der Lage ist, mit zip von der Befehlszeile aus zu arbeiten.

tar.exe -xf archive.zip

oder ein Archiv zu erstellen

tar.exe -cf Test.zip Test
1
1
1
2016-08-02 11:19:52 +0000

Wenn Sie unter Windows 8 oder Windows Server 2012 über PowerShell und .NET 4.5 verfügen, können Sie Folgendes 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, der PowerShell für Sie aufruft, ist das Verzeichnis das erste Argument und der Zip-Name das zweite):

@Echo Off
powershell -ExecutionPolicy ByPass -Command "& '%~dpn0.ps1' -directory '%1' -name '%2'"
-4
-4
-4
2013-05-31 19:54:34 +0000

Die Windows-Kommandozeile bietet jetzt den kompakten Befehl, der, soweit ich das beurteilen kann, Windows-spezifisch ist. Das sollte die geforderten Anforderungen erfüllen, es sei denn, ich habe etwas übersehen.

Advertisement

Verwandte Fragen

3
19
10
28
9
Advertisement